在php中查找未知数组键?

4

我有一个数组

$array = array (
  'pubMessages' => 
  array (
    0 => 
    array (
      'msg' => 'Not bad',
      'type' => 'warning',
    ),
    1 => 
    array (
      'msg' => 'Bad',
      'type' => 'error',
    ),
  ),
);

为了删除具有“type”=>“error”的子数组,我使用以下代码:

要删除具有“type”=>“error”的子数组,我使用以下代码

$key = array_search('error', $array);
unset($array["pubMessages"][$key]);

数组pubMessages的关键字名每次都会改变,请告诉我如何动态获取它的关键字名? 同时,pubMessages中的数组数量也是可变的。

3个回答

4
使用 array_keys() 获取动态键名,然后循环遍历内部数组并检查键 type 是否等于 error,如果是则将其移除。
$dynamicKey = array_keys($array)[0];
foreach($array[$dynamicKey] as $item){
    if ($item['type'] == 'error')
        unset($array[$dynamicKey][$key]);
}

请在演示中检查结果。


谢谢Mohammad,关键字pubMessages的名称是动态更改的。 - DMP

2

我会在这种搜索中使用array_filter(),如下所示:

$array = array(
            'pubMessages' => array (
                0 => array (
                    'msg' => 'Not bad',
                    'type' => 'warning'
                ),
                1 => array (
                    'msg' => 'Bad',
                    'type' => 'error'
                )
            )
        );

// array_search() will return false. It is not how 
// array_search() works on a multi-dimensional array
// $key = array_search('error',$array);

function findError($a) {
    return ($a['type'] != 'error');
}

// deal with "unknown" first index / key name issue
$idx = array_keys($array)[0];
$array[$idx] = array_filter($array[$idx],"findError");

var_dump($array);
exit;

输出结果如下:

array(1) {
    ["pubMessages"]=> array(1) {
        [0]=> array(2) {
             ["msg"]=> string(7) "Not bad"
             ["type"]=> string(7) "warning"
        }
    }
}

编辑:已添加解决未知键/索引问题的修复方案。


在我看来,这可能是正确的方式。 - Nigel Ren
这个解决方案不可行,因为数组pubMessages的键名每次都会改变 - Mohammad
@Mohammad:修复了这个问题,我本以为原帖作者自己就能解决。 - Tigger

1
你可以直接使用foreach()循环整个数组来获取任何元素。
主要问题在于你只是在说。
$key = array_search('error', $array);

这不会查找所有子数组等以找到该值,只会查找顶层。由于错误在数组的type列中,您需要提取该列并在此数组中搜索。您可以使用array_column()来挑选数据。
foreach ( $array as &$subarray ) {
    $key = array_search('error', array_column($subarray, "type"));
    unset($subarray[$key]);
}

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