可以访问密钥的array_map

时间:2015-02-13 17:08:44

标签: php arrays

我需要迭代一个看起来像这样的数组:

$myArray = array(
  'key1' => array('subkey' => 'subvalue'),
  'key2' => array('subkey' => 'subvalue'),
)

在每个嵌套的关联数组中,我想基于外键添加一个键值对,如下所示:

$myNewArray = array(
  'key1' => array('subkey' => 'subvalue', 'newkey' => 'only for key1'),
  'key2' => array('subkey' => 'subvalue'),
)

理想情况下,我正在寻找类似的东西:

$myNewArray = array_map(function($key, $value) {
    if ($key == 'key1') {
        $value['newkey'] = 'only for key1';
    }
    return $value;
}, $myArray);

然而,这显然不起作用,因为callback没有给出两个参数但只有一个参数。我可以这样做:

$myNewArray = array_map(function($key, $value) {
    if ($key == 'key1') {
        $value['newkey'] = 'only for key1';
    }
    return WHAT??
}, array_keys($myArray), $myArray);

然而,我该怎么回?它似乎总是构造一个新数组,即丢弃我的字符串键(key1key2),而单个数组array_map()保留它们。

我可以使用array_walk(),但它有一个相当奇怪的API(翻转参数顺序,通过引用传递的数组等)所以我通常更喜欢使用array_map()来实现这一点。可以吗?

2 个答案:

答案 0 :(得分:1)

array_map只传递值而不是键。 array_walkarray_map非常相似。只需将值定义为参考。它需要array_map没有的关键。此外,这会修改$myArray

array_walk($myArray, function(&$value, $key) {
    if ($key == 'key1') {
        $value['newkey'] = 'only for key1';
    }
});

从PHP手册中,似乎有array_map方法使用array_keys作为另一个数组:

$myNewArray = array_combine(array_keys($myArray), array_map(function($key, $value) {
    if ($key == 'key1') {
        $value['newkey'] = 'only for key1';
    }
    return  $value;
}, array_keys($myArray), $myArray));

答案 1 :(得分:1)

我害怕array_walk()是这样做的方式。

如果您不喜欢array_walk()并坚持使用array_map(),那么,它是可能的。它还涉及使用array_keys()array_values()array_combine(),它既冗长又丑陋但可行:

$myNewArray = array_combine(
    array_keys($myArray),
    array_map(
        function($key, $value) {
            if ($key == 'key1') {
                $value['newkey'] = 'only for key1';
            }
            return $value;
        },
        array_keys($myArray),
        array_values($myArray)     // can omit array_values() and use $myArray
    )
);

你也可以使用array_reduce()来做,但同样的混乱:

$myNewArray = array_reduce(
    array_keys($myArray),
    function (array $carry, $key) use ($myArray) {
        $value = $myArray[$key];
        if ($key == 'key1') {
            $value['newkey'] = 'only for key1';
        }
        $carry[$key] = $value;
        return $carry;
    },
    array()
);

我希望你的条件比$key == 'key1'更复杂,因为只有这样才能编写复杂的遍历。是不是更容易访问正确的元素并对其进行修改?

$myArray['key1']['newkey'] = 'only for key1';