programing

어레이 항목을 값별로 제거하는 중

randomtip 2022. 9. 23. 21:43
반응형

어레이 항목을 값별로 제거하는 중

지정된 값을 가진 어레이 항목을 제거해야 합니다.

if (in_array($id, $items)) {
    $items = array_flip($items);
    unset($items[ $id ]);
    $items = array_flip($items);
}

더 짧은(더 효율적인) 방법으로 할 수 있을까요?

간단한 원라이너로 달성할 수 있습니다.

이 어레이의 경우:

$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')

두 번째 답변을 추가하겠습니다.다양한 방법을 시도하기 위해 간단한 벤치마킹 대본을 작성했습니다.

$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().

제거하다$rm_val부터$arr

unset($arr[array_search($rm_val, $arr)]);

가장 강력한 솔루션은 자체 필터링 기능을 정의할 수 있는 를 사용하는 것입니다.

하지만 어떤 사람들은 그게 좀 과잉 살상이라고 말할지도 몰라요 당신 상황이라면...
단순.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()를 사용해 보세요.

어레이에 고유한 값이 있는 경우에만 솔루션이 기능합니다.

참조:

<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>

필요한 경우 루프에서 array_search 설정을 해제하는 것이 좋습니다.

플립 미포함:

<?php
foreach ($items as $key => $value) {
    if ($id === $value) {
        unset($items[$key]);
    }
}
function deleteValyeFromArray($array,$value)
{
   foreach($array as $key=>$val)
   {
      if($val == $value)
      {
         unset($array[$key]);
      }
   }
   return $array;
}

이 작업에 array_splice 함수를 사용할 수 있습니다. 참조: array_splice

array_splice($array, array_search(58, $array ), 1);

언급URL : https://stackoverflow.com/questions/1883421/removing-array-item-by-value

반응형