Php 使用键名数组在多维数组中添加/编辑值

Php 使用键名数组在多维数组中添加/编辑值,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个长度可变的键名数组,我想用这些名称为数组赋值 例如,我有一个数组,其中列出了不同品牌的汽车和自行车的数量: $vehicles = [ 'cars' => Array ( 'suzuki' => Array ( 'wagon' => 4, 'baleno' => 2 ), 'honda' => Array (

我有一个长度可变的键名数组,我想用这些名称为数组赋值

例如,我有一个数组,其中列出了不同品牌的汽车和自行车的数量:

$vehicles = [
    'cars' => Array
    (
        'suzuki' => Array
        (
            'wagon' => 4,
            'baleno' => 2
        ),
        'honda' => Array
        (
            'civic' => 6
        )
    ),
    'bikes' => array
    (
        'raleigh' => 3,
        'scott' => 3
    )
];
我还有几个键名数组以及要放入主数组中的值:

$keys1 = ['cars', 'honda', 'jazz'];
$value1 = 3;
$keys2 = ['bikes', 'scott'];
$value2 = 1;
$keys3 = ['motorbikes', 'harley-davidson', 'dyna', 'street-bob'];
$value3 = 2;
输入所有这些值后,数组应如下所示:

$vehicles = [
    'cars' => Array
    (
        'suzuki' => Array
        (
            'wagon' => 4,
            'baleno' => 2
        ),
        'honda' => Array
        (
            'civic' => 6,
            'jazz' => 3
        )
    ),
    'bikes' => array
    (
        'raleigh' => 3,
        'scott' => 1
    ),
    'motorbikes' => Array
    (
        'harley-davidson' => Array
        (
            'dyna' => Array
            (
                'street-bob' => 2
            )
        )
    )
];
因此,第一个数组添加了一个以前没有的
$key=>$value
对。第二个数组替换
$array2
末尾的键的值,最后一个数组在没有数组开始时创建一个新数组

如何以这种方式填充数组

eval()
可以解决我的所有问题,但数组是从html创建的,因此存在巨大的安全风险。

我认为,构建键/值对列表的便捷方法如下所示:

// $vehicles is your initial array

$key_paths = [
  ['key_path' =>  ['cars', 'honda', 'jazz'], 'value' => 3],
  ['key_path' =>  ['bikes', 'scott'], 'value' => 1],
  ['key_path' =>  ['motorbikes', 'harley-davidson', 'dyna', 'street-bob'], 'value' => 2],
];
下面是使用
array\u slice
函数和引用的解决方案:

输出:

Array
(
    [cars] => Array
        (
            [suzuki] => Array
                (
                    [wagon] => 4
                    [baleno] => 2
                )

            [honda] => Array
                (
                    [civic] => 6
                    [jazz] => 3
                )
        )

    [bikes] => Array
        (
            [raleigh] => 3
            [scott] => 1
        )

    [motorbikes] => Array
        (
            [harley-davidson] => Array
                (
                    [dyna] => Array
                        (
                            [street-bob] => 2
                        )
                )
        )
)

您可以将
$keys
数组转换为与
$vehicles
相同的格式,然后递归替换它们:

$vehicles = [
    'cars' => [
        'suzuki' => [
            'wagon'  => 1,
            'boleno' => 2
        ]
    ],

    'bikes' => [
        'scott' => 3
    ]

];

$keys = ['cars', 'honda', 'jazz'];
$value  = 3;

function addValues($vehicles, $keys, $value)
{
    $formatted = formatArray($keys, $value);

    return array_replace_recursive($vehicles, $formatted);
}

function formatArray($array, $value)
{
    $format = function ($carry, $item) {
        return [$item => $carry];
    };

    return array_reduce(array_reverse($array), $format, $value);
}

$vehicles = addValues($vehicles, $keys, $value);
var_dump($vehicles);
输出:

array (size=2)
  'cars' => 
    array (size=2)
      'suzuki' => 
        array (size=2)
          'wagon' => int 1
          'boleno' => int 2
      'honda' => 
        array (size=1)
          'jazz' => int 3
  'bikes' => 
    array (size=1)
      'scott' => int 3

太好了,谢谢。一个后续问题:如果unset($current)只删除引用,那么如何在数组中取消特定键的设置?可以通过直接指定某个键(例如
unset($vehicles['cars']['honda']])
)或通过迭代数组(例如
foreach($vehicles as$k=>$v){if($k=='bikes')来取消数组中的特定键的设置unset($vehicles[$k]);}
)这太棒了。非常感谢。我不明白为什么array_merge会出现,所以我在没有测试的情况下测试了它,它做了同样的事情,但速度慢了5倍。“你能告诉我为什么吗?”克丽斯塔林:不客气,我很乐意帮忙。你真的不需要它。事实上,没有它会更快。我之前用第二个数组进行了测试,所以这只是一个遗留问题。我会更新答案。
array (size=2)
  'cars' => 
    array (size=2)
      'suzuki' => 
        array (size=2)
          'wagon' => int 1
          'boleno' => int 2
      'honda' => 
        array (size=1)
          'jazz' => int 3
  'bikes' => 
    array (size=1)
      'scott' => int 3