删除array_walk()中回调函数中的行

moc*_*gin 8 php arrays

我正在尝试使用array_walk()函数以这种方式处理数组:

<?php

$array = array('n1' => 'b1', 'n2' => 'b2', 'n3' => 'b3');

array_walk($array, function(&$val, $key) use (&$array){
    echo $key."\n";
    if ($key == 'n1')
        $val = 'changed_b1';
    if ($key == 'n2' || $key == 'n3') {
        unset($array[$key]);
    }
});

print_r($array);
Run Code Online (Sandbox Code Playgroud)

得到:

n1
n2
Array
(
    [n1] => changed_b1
    [n3] => b3
)
Run Code Online (Sandbox Code Playgroud)

看来,删除第2个元素后的内容 - 第3个元素没有被发送到回调函数.

m6w*_*6w6 10

使用array_filter:

<?php
$filtered = array_filter($array, function($v,$k) {
    return $k !== "n2" && $k !== "n3";
}, ARRAY_FILTER_USE_BOTH);
?>
Run Code Online (Sandbox Code Playgroud)

http://php.net/array_filter

  • 很高兴提到PHP> = 5.6.x (5认同)

ʰᵈˑ*_*ʰᵈˑ 6

您可以做的是使用辅助阵列,这将产生那些节点已被删除的效果,例如;

<?php

$array = array('n1' => 'b1', 'n2' => 'b2', 'n3' => 'b3');

$arrFinal = array();
array_walk($array, function($val, $key) use (&$array, &$arrFinal){
    echo $key."\n";
    if ($key == 'n2' || $key == 'n3') {
        //Don't do anything
    } else {
       $arrFinal[$key] = $val;
    }
});

print_r($arrFinal);
Run Code Online (Sandbox Code Playgroud)

https://eval.in/206159