使用替换值的平面数组替换 2D 数组中的列值


Replace column values in a 2d array using a flat array of replacement values

我有一个这种格式的二维数组:

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