PHP从关联数组中删除元素

PHP从关联数组中删除元素,php,arrays,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

我有一个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_转储数组值时,我得到以下结果:

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" } }
我想删除已完成标记为垃圾邮件。我知道我可以
取消设置[$array[3],$array[4])
,但问题是有时索引编号可能不同

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

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

你的数组很奇怪:为什么不把
键作为索引,把
值作为…值?

如果您的数组是这样声明的,不是会容易得多吗

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$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'), 
);
这将允许您使用
key
的值作为索引来访问数组

您可以使用函数来搜索值,例如:

比使用阵列更容易,不是吗



相反,使用如下所示的阵列:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$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'), 
);

您必须循环所有项目,以分析
,并取消设置正确的项目:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);
即使可以,也不是那么简单……我坚持认为:为了使用更简单的键/值系统,您不能更改数组的格式吗?

尝试以下方法:

$keys = array_keys($array, "Completed");
/编辑
正如JohnP所提到的,此方法仅适用于非嵌套数组。

执行此操作的方法是获取嵌套目标数组,并将其单步复制到非嵌套数组。
  ...

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



  return array_values($array);
  ...
删除键,然后将最终修剪的数组指定给先前数组的嵌套节点。 下面是一个简单的代码:

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

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

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

对于单个阵列项目,请使用重置($Item)

为什么不使用阵列差异

$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);
请注意,您的数组将被重新索引。

您可以使用此

unset($dataArray['key']);

我有点不同意接受的答案。有时应用程序架构不希望您弄乱数组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字段)在你想要的嵌入式函数中。

不确定我是否理解这里的问题?你是什么意思?有时索引编号可能不同?谢谢,我只是在寻找它。!:)很好,很简单。只是寻找它这是真实的答案,而不是检查过的答案。重置函数应该用于移动内部数组pointer,不从数组中删除项或未设置项。请改用未设置项。如果您的解决方案有效,它也会产生不必要的副作用。“您必须循环所有项,以分析值”。使用数组搜索时,您还可以搜索所有项。