PHP从关联数组中删除元素

时间:2011-03-27 15:17:20

标签: php arrays

我有一个看起来像这样的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]),但问题是有时索引号可能不同。

有没有办法通过匹配值名称而不是键值来删除它们?

9 个答案:

答案 0 :(得分:144)

您的数组非常奇怪:为什么不使用key作为索引,value作为...值?

如果您的数组声明如下,那会不会更容易:

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

即使可行,也不是那么简单......我坚持认为:你能不能改变阵列的格式,使用更简单的键/值系统?

答案 1 :(得分:94)

  ...

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



  return array_values($array);
  ...

答案 2 :(得分:13)

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

对于2D阵列......

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

答案 3 :(得分:4)

您可以使用此

unset($dataArray['key']);

答案 4 :(得分: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);

请注意,您的阵列将重新编制索引。

答案 5 :(得分:1)

试试这个:

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

/编辑 正如JohnP所提到的,此方法仅适用于非嵌套数组。

答案 6 :(得分:0)

执行此操作以获取嵌套目标数组并将其单步复制到非嵌套数组的方法。 删除键,然后将最终修剪的数组分配给早期数组的嵌套节点。 这是一个简单的代码:

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

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

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

答案 7 :(得分:0)

我有点不同意接受的答案。有时,应用程序体系结构不希望您弄乱数组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字段)。

答案 8 :(得分:-1)

单个数组使用reset($item)

相关问题