我有一个这种格式的二维数组:
$oldArr = [
0 => [
"color" => "red",
"shape" => "circle",
"size" => "small",
],
1 => [
"color" => "green",
"shape" => "square",
"size" => "large",
],
2 => [
"color" => "yellow",
"shape" => "triangle",
"size" => "large",
],
];
以及这种格式的一维数组:
$newVals = [
0 => "large",
1 => "large",
2 => "small",
];
我尝试使用 str_replace()
遍历 $oldArr
中的每个"size"
值,并将其替换为与其位置匹配的 $newVals
值。由于这些数组将始终具有相同数量的顶级键值对,因此我基本上尝试获取$newVals
并将其映射到每个$oldArr["size"]
值上。最终结果应该是
$newArr = [
0 => [
"color" => "red",
"shape" => "circle",
"size" => "large",
],
1 => [
"color" => "green",
"shape" => "square",
"size" => "large",
],
2 => [
"color" => "yellow",
"shape" => "triangle",
"size" => "small",
],
];
谁能推荐最好的方法来解决这个问题?我尝试在 foreach 循环中str_replace
,但它不起作用:
foreach($oldArr as $entity):
str_replace($entity['size'], $newVals, $entity);
endforeach;
您可以使用
array_map()
并一次遍历两个数组,而不是使用原始数组的大小值,您只需使用新数组,例如
$result = array_map(function($old, $new){
return ["color" => $old["color"], "shape" => $old["shape"], "size" => $new];
}, $oldArr, $newVals);
您可以使用以下代码:
<?php
$oldArr = [
0 => [
"color" => "red",
"shape" => "circle",
"size" => "small",
],
1 => [
"color" => "green",
"shape" => "square",
"size" => "large",
],
2 => [
"color" => "yellow",
"shape" => "triangle",
"size" => "large",
],
];
$newVals = [
0 => "large",
1 => "large",
2 => "small",
];
$newArr = array();
foreach($oldArr as $key => $entity){
$newEntity = $entity;
$newEntity['size'] = $newVals[$key];
$newArr[$key] = $newEntity;
}
var_dump($newArr);
array_walk()
修改原始数组:(演示)
array_walk(
$oldArr,
fn(&$row, $i) => $row['size'] = $newVals[$i]
);
var_export($oldArr);
<小时 /> foreach()
修改原始数组:(演示)
foreach ($oldArr as $i => ['size' => &$size]) {
$size = $newVals[$i];
}
var_export($oldArr);
<小时 /> 生成新阵列foreach()
:(演示)
$result = [];
foreach ($oldArr as $i => $row) {
$row['size'] = $newVals[$i];
$result[] = $row;
}
var_export($result);
<小时 /> array_map()
同步迭代两个数组并避免声明结果数组:(演示)
var_export(
array_map(
fn($row, $size) => array_replace($row, ['size' => $size]),
$oldArr,
$newVals
)
);
*由于要连接的行包含关联/非数字键,因此array_merge()
和array_replace()
的行为相同。 数组联合运算符(+
)不能用于此任务,因为它保留了两个有效载荷包含相同键的左侧元素 - 换句话说,不会有任何变化。
新值更改为 2D 数组后array_replace_recursive()
:(演示)
var_export(
array_replace_recursive(
$oldArr,
array_map(fn($size) => ['size' => $size], $newVals)
)
);