我需要迭代一个看起来像这样的数组:
$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);
然而,我该怎么回?它似乎总是构造一个新数组,即丢弃我的字符串键(key1
和key2
),而单个数组array_map()
保留它们。
我可以使用array_walk()
,但它有一个相当奇怪的API(翻转参数顺序,通过引用传递的数组等)所以我通常更喜欢使用array_map()
来实现这一点。可以吗?
答案 0 :(得分:1)
array_map
只传递值而不是键。 array_walk
与array_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';