PHP manipulating multidimensional array values

2020-06-22 08:18发布

I have a result set as an array from a database that looks like:

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"
    )
)

How would I apply a function to replace the values of an array only on the array key with b? Normally I would just rebuild a new array with a foreach loop and apply the function if the array key is b, but I'm not sure if it's the best way. I've tried taking a look at many array functions and it seemed like array_walk_recursive is something I might use, but I didn't have luck in getting it to do what I want. If I'm not describing it well enough, basically I want to be able to do as the code below does:

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

Should I stick with that, or is there a better way?

标签: php arrays
3条回答
做自己的国王
2楼-- · 2020-06-22 08:59

Using array_walk_recursive:

If you have PHP >= 5.3.0 (for anonymous functions):

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

Otherwise something like:

function _my_method(&$item, $key) {
    if ($key == 'b') {
        $item = 'the key is b!';
    }
}
array_walk_recursive($result, '_my_method');
查看更多
欢心
3楼-- · 2020-06-22 08:59

Untested but I think this will work.

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

The function will move through an array checking the keys for b. If the key points to an array it recursively follows it down.

查看更多
够拽才男人
4楼-- · 2020-06-22 09:01

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

The replacer function might be overkill. You can replace it with a literal or anything you like.

查看更多
登录 后发表回答