按值删除数组项

Mar*_*rek 164 php arrays

我需要删除给定值的数组项:

if (in_array($id, $items)) {
    $items = array_flip($items);
    unset($items[ $id ]);
    $items = array_flip($items);
}
Run Code Online (Sandbox Code Playgroud)

可以用更短(更有效)的方式完成吗?

Ale*_*ias 418

它可以通过简单的单线程来完成.

拥有这个数组:

$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
Run Code Online (Sandbox Code Playgroud)

你可以做:

$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
Run Code Online (Sandbox Code Playgroud)

而且价值$arr将是:

array('nice_item', 'another_liked_item')
Run Code Online (Sandbox Code Playgroud)

希望它有助于编写漂亮的代码.

  • 不,它**与引用的数组一起工作,`array_diff`函数是非破坏性的,它返回一个新数组. (2认同)
  • @srcspider为什么不呢?`$ referenced = array_diff($ referenced,$ items_to_remove);` (2认同)
  • @srcspider好吧,你告诉我这里发生了什么...... http://codepad.org/11ZhiFP0 (2认同)

zom*_*bat 37

我正在补充第二个答案.我写了一个快速的基准测试脚本来尝试各种方法.

$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>';
Run Code Online (Sandbox Code Playgroud)

第三种方法,array_keys()指定了可选的搜索参数,似乎是目前最好的方法.输出示例:

499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds
Run Code Online (Sandbox Code Playgroud)

鉴于此,我将使用的解决方案是:

$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
    unset($items[$k]);
}
Run Code Online (Sandbox Code Playgroud)


zom*_*bat 31

怎么样:

if (($key = array_search($id, $items)) !== false) unset($items[$key]);
Run Code Online (Sandbox Code Playgroud)

或多个值:

while(($key = array_search($id, $items)) !== false) {
    unset($items[$key]);
}
Run Code Online (Sandbox Code Playgroud)

这也可以防止密钥丢失,这是一个副作用array_flip().


小智 15

除去$rm_val$arr

unset($arr[array_search($rm_val, $arr)]);
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 8

最强大的解决方案是使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Sav*_*man 6

试试array_search()

  • 我刚刚阅读了文档,并建议使用array_keys()来查找与值关联的所有键. (3认同)

Dut*_*tow 6

只有在阵列中具有唯一值时,您的解决方案才有效

看到:

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

如果需要,可以在循环中使用array_search更好的方法.


ere*_*non 5

没有翻转:

<?php
foreach ($items as $key => $value) {
    if ($id === $value) {
        unset($items[$key]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Sum*_*was 5

function deleteValyeFromArray($array,$value)
{
   foreach($array as $key=>$val)
   {
      if($val == $value)
      {
         unset($array[$key]);
      }
   }
   return $array;
}
Run Code Online (Sandbox Code Playgroud)