PHP操纵多维数组值

时间:2011-01-02 06:22:45

标签: php arrays

我将结果集设置为数据库中的数组,如下所示:

array (
    0 => array (
        "a" => "something"
        "b" => "something"
        "c" => "something"
    )
    1 => array (
        "a" => "something"
        "b" => "something"
        "c" => "something"
    )
    2 => array (
        "a" => "something"
        "b" => "something"
        "c" => "something"
    )
)

我如何应用一个函数来仅在数组键上用b替换数组的值?通常我会用foreach循环重建一个新数组,如果数组键是b,则应用该函数,但我不确定它是否是最好的方法。我试过看看很多数组函数,看起来像array_walk_recursive是我可能会使用的东西,但我没有运气让它做我想做的事情。如果我没有足够好地描述它,基本上我希望能够像下面的代码那样做:

$arr = array();
foreach ($result as $key => $value)
{
    foreach ($value as $key2 => $value2)
    {
        $arr[$key][$key2] = ($key2 == 'b' ? $this->_my_method($value2) : $value2);
    }    
}

我应该坚持下去,还是有更好的方法?

3 个答案:

答案 0 :(得分:4)

使用array_walk_recursive

如果你有PHP> = 5.3.0(对于anonymous functions):

array_walk_recursive($result, function (&$item, $key) {
    if ($key == 'b') {
        $item = 'the key is b!';
    }
});

否则就像:

function _my_method(&$item, $key) {
    if ($key == 'b') {
        $item = 'the key is b!';
    }
}
array_walk_recursive($result, '_my_method');

答案 1 :(得分:0)

未经测试,但我认为这会奏效。

function replace_b (&$arr)
{
    foreach ($arr as $k => $v)
    {
        if ($k == 'b')
        {
            /* Do something */
        }
        if (is_array($v)
        {
            replace_b($arr[$k]);
        }
    }
}

该函数将在数组中移动,检查b的键。如果键指向数组,则递归地跟随它。

答案 2 :(得分:0)

使用array_walk_recursive documented here

$replacer = function($x) {return "I used to be called $x";}; //put what you need here
$replaceB = function(&$v, $k) use ($replacer) {if ($k === 'b') $v = $replacer($v);};

array_walk_recursive($arr, $replaceB);

replacer功能可能有点矫枉过正。你可以用文字或任何你喜欢的东西替换它。