组合二维数组每行中的列值以形成动态键控元素

问题描述 投票:0回答:7

我有这个数组:

$params = [
    ['name'  => 'xxx', 'value' => 'yyy'],
    ['name'  => 'uuu', 'value' => 'vvv']
];

我想实现这个:

$params = [
    ['xxx' => 'yyy'],
    ['uuu' => 'vvv']
];

我可以这样做:

foreach ($params as &$param) {
    $param[$param['name']] = $param['value'];
    unset($param['name']);
    unset($param['value']);
    unset($param);
}

但我想知道这是否可以以更优雅的方式完成?

php arrays multidimensional-array
7个回答
6
投票

这需要值的数组映射

$params = array_map(function ($i) { return [$i['name'] => $i['value']]; }, $params);

1
投票

您可以使用

array_map
来重申数组。

$params = [
  [
    'name'  => "xxx",
    'value' => "yyy"
  ],
  [
    'name'  => "uuu",
    'value' => "vvv"
  ]
];

$params = array_map(function($o){
    return [ $o['name'] => $o['value'] ];
}, $params);


echo "<pre>";
print_r( $params );
echo "</pre>";

这将导致:

Array
(
    [0] => Array
        (
            [xxx] => yyy
        )

    [1] => Array
        (
            [uuu] => vvv
        )

)

文档:array_map()


0
投票

这个有点短。如果不使用

foreach
,您可以直接替换元素。

for ($i = 0; $i < count ($params); $i++)
    $params[$i] = array ($params[$i]['name'] => $params[$i]['value']);

0
投票

为了使当前的代码更加优雅,您可以将多个参数传递给 unset

foreach ($params as &$param) {
    $param[$param['name']] = $param['value'];
    unset($param['name'], $param['value'], $param);
}

0
投票

试试这个:

foreach ($params as $key => $sub_array) {

    // unset original array data
    unset($params[$key]);

    // construct the new values
    $params[$key][$sub_array['name']] = $sub_array['value'];
}

编辑:

另一种更优雅的方法如下:

foreach($params as $k=>$s){
    $params[$k]=array($s['name']=>$s['value']);
}

0
投票

以下所有代码片段都将从提供的输入数组中产生相同的所需结果。 演示

使用无体循环创建一个新数组。

$result = [];
foreach ($params as ['name' => $k, 'value' => $result[][$k]]);
var_export($result);

使用迭代块和组合创建一个新数组。

var_export(
    array_map(
        fn($row) => array_combine(...array_chunk($row, 1)),
        $params
    )
);

使用迭代硬编码声明创建一个新数组。

var_export(
    array_map(
        fn($row) => [$row['name'] => $row['value']],
        $params
    )
);

通过将列减少为平面关联数组来创建一个新数组,然后重新扩展为二维数组。

var_export(
    array_chunk(
        array_column($params, 'value', 'name'),
        1,
        true
    )
);

不使用一级键,通过引用修改原始数组。

foreach ($params as &$row) {
    $row = [$row['name'] => $row['value']];
}
var_export($params);

-3
投票

请尝试这个:

foreach ($params as $k => $v)
{
    $nary[$v[name]] = $v[value];
}

$params = $nary;
© www.soinside.com 2019 - 2024. All rights reserved.