PHP从关联数组中移除元素

104

我有一个 PHP 数组,看起来像这样:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

当我使用 var_dump 函数输出数组的值时,我得到了这个:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

我想要移除 已完成标记为垃圾邮件。 我知道可以使用 unset($array[3], $array[4]),但问题在于索引号有时可能不同。

是否有一种方法可以通过匹配值名称而不是键值来删除它们?


我不确定我是否理解这里提出的问题?你是什么意思,有时索引号可能会不同? - Simon H
9个回答

160
你的数组很奇怪:为什么不直接使用“键”作为索引,而将“值”作为值呢?如果你的数组像这样声明,不是更容易吗:
$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

那样可以让你使用key的值作为索引来访问数组...
而且你还可以使用函数来根据值进行搜索,比如 array_search()
$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

比起你的数组,这个更容易吧?

相反,使用以下这样的数组:
$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

你需要遍历所有的项目,分析value,并取消正确的项目:
foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

即使可以做到,也并不那么简单...而且我坚持认为:你能不能改变数组的格式,使用一个更简单的键值对系统来工作呢?

你需要循环遍历所有项来分析值。当使用array_search时,也可能要搜索所有项。 - Nicolas Aoki

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
谢谢,我只是在寻找这个而已! :) - Ravi Dhoriya ツ
2
很好很容易的。只是在寻找这个。 - Faisal Mehmood Awan
这是真正的答案,而不是被检查过的。 - A.Seddighi

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

对于二维数组...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}

7
您可以使用此

标签


unset($dataArray['key']);

3

为什么不使用array_diff?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

请注意,您的数组将被重新索引。


1

试试这个:

$keys = array_keys($array, "Completed");

如JohnP所述,此方法仅适用于非嵌套数组。

1
我有点不同意已接受的答案。有时候,应用程序架构不希望您干扰数组id,或者这样做很不方便。例如,我经常使用CakePHP,数据库查询返回每个记录中的主键作为一个值,与上述非常相似。
假设数组不是非常大,我会使用array_filter。这将创建一个数组副本,减去您想要删除的记录,并将其赋回给原始数组变量。
尽管这看起来效率不高,但现在让变量不可变非常流行,事实上,大多数php数组函数返回一个新的数组而不是对原始数组进行操作,这意味着PHP也希望您这样做。当您使用数组越多,并意识到unset()函数有多么困难和烦人时,这种方法就变得很有意义。
无论如何:
$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

您可以在嵌入函数中使用任何包含逻辑(例如,您的ID字段)。


0

解决这个问题的方法是将嵌套的目标数组一次性复制到一个非嵌套的数组中。 删除键(们),然后将最终修剪过的数组赋值给之前数组的嵌套节点。 以下是一个简单的代码示例:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

-1

对于单个数组项,请使用reset($item)


1
重置函数应该用于移动内部数组指针,而不是从数组中删除或取消设置项目。请使用unset代替。如果您的解决方案甚至有效,它也会产生不必要的副作用。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接