다음과 같이 PHP 배열이 있습니다.
$messages = [312, 401, 1599, 3, ...];
값이 포함 된 요소 $del_val
(예 :)를 삭제하고 $del_val=401
싶지만 키를 모르겠습니다. 도움이 될 수 있습니다. 각 값은 한 번만있을 수 있습니다 .
이 작업을 수행하는 가장 간단한 기능을 찾고 있습니다.
다음과 같이 PHP 배열이 있습니다.
$messages = [312, 401, 1599, 3, ...];
값이 포함 된 요소 $del_val
(예 :)를 삭제하고 $del_val=401
싶지만 키를 모르겠습니다. 도움이 될 수 있습니다. 각 값은 한 번만있을 수 있습니다 .
이 작업을 수행하는 가장 간단한 기능을 찾고 있습니다.
답변:
사용 array_search()
하고 unset
, 다음을 시도하십시오
if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
찾은 요소의 키를 반환합니다.이 키는를 사용하여 원래 배열에서 해당 요소를 제거하는 데 사용할 수 있습니다 unset()
. FALSE
실패시 리턴 되지만 성공시 false-y 값을 리턴 할 수 있습니다 ( 0
예 : 키일 수 있음 ). 따라서 엄격한 비교 !==
연산자가 사용됩니다.
if()
문 여부를 확인합니다 array_search()
값을 반환하고 한 경우에만 작업을 수행합니다.
array_diff()
때 느려질 것 입니다. array_search()
$key
이다 0
?
0
또는 다른 잘못된 값이 있으면 값이 설정 해제되지 않고 코드가 작동하지 않습니다. 테스트해야합니다 $key === false
. (편집-당신이 그것을 얻었다)
배열에서 요소를 삭제하는 것은 기본적으로 하나의 요소와의 차이 를 설정 합니다.
array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
원하는 경우 동시에 원하는만큼 많은 요소를 제거 할 수 있습니다.
면책 조항 : 내 솔루션은 배열의 새로운 사본을 생성하면서 변경 된 수용 된 대답과 대조적으로 이전 배열을 그대로 유지합니다. 필요한 것을 선택하십시오.
[$element]
사용 array($element)
했습니다. 큰 문제는 아니지만 비슷한 문제가있는 사람이 혼자가 아니라는 것을 알기를 원했습니다.
array_diff
사용 한다는 점은 주목할 가치가 있습니다. @ nischayn22가 지적한 문제는 그 결과입니다. 임의의 요소 (객체 일 수도 있음)의 배열에서 작동하는 유틸리티 함수로 무언가를 사용하려면 Bojangle의 대답이 더 좋을 수 있습니다. (string) $elem1 === (string) $elem2
$elem1 === $elem2
array_diff()
하므로 O (n)에서 최대 O (n lg n)까지 런타임을 이동시킵니다.
흥미로운 방법 중 하나는 다음을 사용하는 것입니다 array_keys()
.
foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
이 array_keys()
함수는 특정 값에 대한 키와 엄격한 검사가 필요한지 여부를 비교하기 위해 두 개의 추가 매개 변수를 사용합니다 (예 : 비교에 === 사용).
또한 같은 값을 가진 여러 배열 항목을 제거 할 수도 있습니다 (예 :) [1, 2, 3, 3, 4]
.
array_values()
합니다. 나머지 키는 여전히 같은 순서로되어 있으므로 기술적으로 "정렬되지 않은"것은 아닙니다.
배열에 해당 값을 가진 요소가 하나만 포함된다는 것을 확실히 알고 있다면
$key = array_search($del_val, $array);
if (false !== $key) {
unset($array[$key]);
}
그러나 배열에서 값이 두 번 이상 발생할 수 있다면 이렇게 할 수 있습니다
$array = array_filter($array, function($e) use ($del_val) {
return ($e !== $del_val);
});
참고 : 두 번째 옵션은 클로저가있는 PHP5.3 +에서만 작동합니다
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
다음 코드를 살펴보십시오.
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
넌 할 수있어:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
그리고 그것은 당신 에게이 배열을 얻을 것입니다 :
array('nice_item', 'another_liked_item')
가장 좋은 방법은 array_splice
array_splice($array, array_search(58, $array ), 1);
Best 이유는 http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/ 에 있습니다 .
[1, 2, 4 => 3]
.
3
후 배열은 다음과 같습니다 [1, 2, 3]
. 즉, 값이 제거되지 않았습니다. 분명히, 나는 이것이 모든 시나리오에서 실패한다고 말하지는 않습니다.
또는 간단히 수동 방법 :
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
어레이를 완전히 제어 할 수 있기 때문에 이것이 가장 안전합니다
array_splice()
대신에 unset()
를 사용 하면 배열 인덱스의 순서도 변경되므로이 경우 더 좋습니다.
다음 코드에 따르면 반복 값이 $ messages에서 제거됩니다.
$messages = array_diff($messages, array(401));
PHP 5.3+
가있는 경우 한 줄 코드가 있습니다.
$array = array_filter($array, function ($i) use ($value) { return $i !== $value; });
$value
그래서 정말 당신이 액세스 할 수 있도록 미니 클래스에 투입되어야한다, $value
... 폐쇄 내
function array_remove_by_value($array, $value)
{
return array_values(array_diff($array, array($value)));
}
$array = array(312, 401, 1599, 3);
$newarray = array_remove_by_value($array, 401);
print_r($newarray);
산출
Array ( [0] => 312 [1] => 1599 [2] => 3 )
넌 할 수있어:
unset($messages[array_flip($messages)['401']]);
설명 : 401
배열을 뒤집은 후 키가있는 요소를 삭제하십시오 .
401
? 인 요소가 여러 개인 경우 어떻게해야 합니까?
여러 값을 삭제하려면 다음 중 하나를 시도하십시오.
while (($key = array_search($del_val, $messages)) !== false)
{
unset($messages[$key]);
}
Underscore.JS _.reject의 논리를 빌려 두 함수를 만들었습니다 (사람들은 함수를 선호합니다 !!)
array_reject_value : 이 함수는 단순히 지정된 값을 거부합니다 (PHP4,5,7에서도 작동)
function array_reject_value(array &$arrayToFilter, $deleteValue) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if ($value !== $deleteValue) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
array_reject : 이 함수는 단순히 호출 가능한 메소드를 거부합니다 (PHP> = 5.3에서 작동)
function array_reject(array &$arrayToFilter, callable $rejectCallback) {
$filteredArray = array();
foreach ($arrayToFilter as $key => $value) {
if (!$rejectCallback($value, $key)) {
$filteredArray[] = $value;
}
}
return $filteredArray;
}
현재 예제에서 위의 기능을 다음과 같이 사용할 수 있습니다.
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);
또는 더 나은 : (이것은 우리에게 array_filter 와 같은 더 나은 구문을 제공하기 때문에 )
$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
return $value === 401;
});
위의 내용은 401보다 크거나 같은 모든 값을 제거하고 싶다고 가정하는 것처럼보다 복잡한 작업에 사용할 수 있습니다.
$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
return $value >= $greaterOrEqualThan;
});
$array = array("apple", "banana",'mango');
$array = array_filter($array, function($v) { return $v != "apple"; });
이것을 시도하십시오, 이것은 값으로 요소를 제거하는 가장 빠르고 빠른 방법입니다
@Bojangles 답변이 도움이되었습니다. 감사합니다.
제 경우에는 배열이 연관 될 수도 있고 그렇지 않을 수도 있으므로 다음 함수를 추가했습니다.
function test($value, $tab) {
if(($key = array_search($value, $tab)) !== false) {
unset($tab[$key]); return true;
} else if (array_key_exists($value, $tab)){
unset($tab[$value]); return true;
} else {
return false; // the $value is not in the array $tab
}
}
문안 인사
단일 라이너 코드 ( array_diff () 덕분에 ) 다음을 사용하십시오.
$messages = array_diff($messages, array(401));
배열에 고유 한 값을 유지하는 데 관심이 있다면 " 각 값은 한 번만있을 수 있습니다 "라는 요구 사항에 따라 원하는 값 array_unique()
이 될 수 있습니다.
입력:
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
결과:
array(2) {
[0] => int(4)
[2] => string(1) "3"
}
삭제하려는 값이 배열에 있거나 배열에있을 수있는 경우 array_diff 함수를 사용하십시오 . 이런 것들에 잘 작동하는 것 같습니다.
$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);
나는 이것이 효율적이지 않지만 간단하고 직관적이며 읽기 쉽다는 것을 알고 있습니다.
따라서 누군가가 더 많은 가치 또는 더 구체적인 조건으로 작동하도록 확장 될 수있는 그렇게 화려하지 않은 솔루션을 찾고 있다면 .. 여기 간단한 코드가 있습니다.
$result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);
foreach($arr as $key =>$value){
if ($value !== $del_value){
$result[$key] = $value;
}
//if(!in_array($value, $del_values)){
// $result[$key] = $value;
//}
//if($this->validete($value)){
// $result[$key] = $value;
//}
}
return $result
로 배열 키를 가져옵니다 array_search()
.
키를 모른다면 중요하지 않다는 것을 의미합니다.
값을 키로 배치 할 수 있습니다. 즉, 값을 즉시 찾을 수 있습니다. 모든 요소에서 검색을 반복해서 사용하는 것보다 낫습니다.
$messages=array();
$messages[312] = 312;
$messages[401] = 401;
$messages[1599] = 1599;
$messages[3] = 3;
unset($messages[3]); // no search needed
이 URL을 참조 할 수 있습니다 : 기능
array-diff-key()
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
var_dump(array_diff_key($array1, $array2));
?>
그런 다음 출력은
array(2) {
["red"]=>
int(2)
["purple"]=>
int(4)
}
배열의 값을 삭제하는 또 다른 아이디어는 array_diff를 사용하십시오. 내가 원한다면
$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));
가장 간단한 방법은 foreach 루프와 함께 함수를 사용하는 것입니다.
//This functions deletes the elements of an array $original that are equivalent to the value $del_val
//The function works by reference, which means that the actual array used as parameter will be modified.
function delete_value(&$original, $del_val)
{
//make a copy of the original, to avoid problems of modifying an array that is being currently iterated through
$copy = $original;
foreach ($original as $key => $value)
{
//for each value evaluate if it is equivalent to the one to be deleted, and if it is capture its key name.
if($del_val === $value) $del_key[] = $key;
};
//If there was a value found, delete all its instances
if($del_key !== null)
{
foreach ($del_key as $dk_i)
{
unset($original[$dk_i]);
};
//optional reordering of the keys. WARNING: only use it with arrays with numeric indexes!
/*
$copy = $original;
$original = array();
foreach ($copy as $value) {
$original[] = $value;
};
*/
//the value was found and deleted
return true;
};
//The value was not found, nothing was deleted
return false;
};
$original = array(0,1,2,3,4,5,6,7,4);
$del_val = 4;
var_dump($original);
delete_value($original, $del_val);
var_dump($original);
출력은 다음과 같습니다.
array(9) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[4]=>
int(4)
[5]=>
int(5)
[6]=>
int(6)
[7]=>
int(7)
[8]=>
int(4)
}
array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(2)
[3]=>
int(3)
[5]=>
int(5)
[6]=>
int(6)
[7]=>
int(7)
}