답변:
간단한 원 라이너로 달성 할 수 있습니다.
이 배열을 갖는 것 :
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
넌 할 수있어:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
그리고 가치 $arr
는 다음과 같습니다.
array('nice_item', 'another_liked_item')
그것이 아름다운 코드를 작성하는 데 도움이되기를 바랍니다.
array_diff
함수는 새로운 배열을 반환, 비파괴입니다.
$referenced = array_diff($referenced, $items_to_remove);
두 번째 답변을 추가하고 있습니다. 다양한 방법을 시도하기 위해 빠른 벤치마킹 스크립트를 작성했습니다.
$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
$arr[$i] = rand(0,PHP_INT_MAX);
}
shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;
/**
* Method 1 - array_search()
*/
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 2 - basic loop
*/
$start = microtime(true);
foreach($arr2 as $k => $v) {
if ($v == 123456) {
unset($arr2[$k]);
}
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 3 - array_keys() with search parameter
*/
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';
array_keys()
선택적 검색 매개 변수가 지정된 세 번째 방법 은 지금까지 가장 좋은 방법 인 것 같습니다. 출력 예 :
499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds
이것으로 판단하면 내가 사용할 솔루션은 다음과 같습니다.
$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
unset($items[$k]);
}
어때요?
if (($key = array_search($id, $items)) !== false) unset($items[$key]);
또는 여러 값의 경우 :
while(($key = array_search($id, $items)) !== false) {
unset($items[$key]);
}
이렇게하면 키 손실도 방지 할 수 있으며 이는 부작용입니다 array_flip()
.
가장 강력한 솔루션은 array_filter
하는 자체 필터링 기능을 정의 할 수 있습니다.
그러나 일부는 ... 그것은 조금 상황에서, 과잉 말할 수
간단foreach
배열을 통과하고 원하지 않는 항목을 제거 루프이면 충분합니다.
귀하의 경우 다음과 같은 것이 트릭을 수행해야합니다.
foreach ($items as $key => $value) {
if ($value == $id) {
unset($items[$key]);
// If you know you only have one line to remove, you can decomment the next line, to stop looping
//break;
}
}
array_search () 사용해 보기
array_keys()
를 실행했으며이 array_search()
작업 보다 성능이 더 좋은 것 같습니다 .
솔루션은 배열에 고유 한 값이있는 경우에만 작동합니다
보다:
<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>
필요한 경우 루프에서 array_search로 더 좋은 방법을 설정하지 않을 수 있습니다 .
이 작업에 array_splice 함수를 사용할 수 있습니다. Ref : array_splice
array_splice($array, array_search(58, $array ), 1);