我有这个数组:
params {
[0] => {
name => "xxx"
value => "yyy"
}
[1] => {
name => "uuu"
value => "vvv"
}
}
我想实现这个:
params {
[0] => {
xxx => "yyy"
}
[1] => {
uuu => "vvv"
}
}
我可以这样做:
foreach ($params as &$param) {
$param[$param['name']] = $param['value'];
unset($param['name']);
unset($param['value']);
unset($param);
}
但我想知道这是否可以以更优雅的方式完成?
这需要值的数组映射:
$params = array_map(function ($i) { return [$i['name'] => $i['value']]; }, $params);
您可以使用
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()
这个有点短。如果不使用
foreach
,您可以直接替换元素。
for ($i = 0; $i < count ($params); $i++)
$params[$i] = array ($params[$i]['name'] => $params[$i]['value']);
为了使当前的代码更加优雅,您可以将多个参数传递给 unset
foreach ($params as &$param) {
$param[$param['name']] = $param['value'];
unset($param['name'], $param['value'], $param);
}
试试这个:
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']);
}
以下所有代码片段都将从提供的输入数组中产生相同的所需结果。 演示
使用无体循环创建一个新数组。
$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
)
);
不使用一级键,通过引用修改原始数组。
foreach ($params as &$row) {
$row = [$row['name'] => $row['value']];
}
var_export($params);
请尝试这个:
foreach ($params as $k => $v)
{
$nary[$v[name]] = $v[value];
}
$params = $nary;