我有以下数组:
$arr = [
"elem-1" => [ "title" => "1", "desc" = > "" ],
"elem-2" => [ "title" => "2", "desc" = > "" ],
"elem-3" => [ "title" => "3", "desc" = > "" ],
"elem-4" => [ "title" => "4", "desc" = > "" ],
]
首先我需要将值从
[ "title" => "1", "desc" = > "" ]
更改为 1
(标题的值)。
我使用
array_walk
做到了这一点:
array_walk($arr, function(&$value, $key) {
$value = $value["title"];
});
这将正确替换我的值。我们现在的数组是:
$arr = [
"elem-1" => "1",
"elem-2" => "2",
"elem-3" => "3",
"elem-4" => "4",
]
现在,我需要将该数组的每个元素转换为它自己的子数组。我不知道如何在没有
for
循环的情况下做到这一点。这就是想要的结果:
$arr = [
[ "elem-1" => "1" ],
[ "elem-2" => "2" ],
[ "elem-3" => "3" ],
[ "elem-4" => "4" ],
]
您可以更改
array_walk
回调来生成该数组。
array_walk($arr, function(&$value, $key) {
$value = [$key => $value["title"]];
});
如果需要删除字符串键,请通过
array_values
运行转换后的数组。
$arr = array_values($arr);
要提供替代解决方案,您可以通过
array_map
实现所有这些
<?php
$arr = [
"elem-1" => [ "title" => "1", "desc" => "" ],
"elem-2" => [ "title" => "2", "desc" => "" ],
"elem-3" => [ "title" => "3", "desc" => "" ],
"elem-4" => [ "title" => "4", "desc" => "" ],
];
function convertToArray($key,$elem){
return [$key => $elem['title']];
}
$arr = array_map("convertToArray", array_keys($arr), $arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
?>
输出
Array
(
[0] => Array
(
[elem-1] => 1
)
[1] => Array
(
[elem-2] => 2
)
[2] => Array
(
[elem-3] => 3
)
[3] => Array
(
[elem-4] => 4
)
)
使用
array_walk()
并通过引用进行修改没有多大意义,因为最终结果需要在两个级别上都有全新的键。 换句话说,输出结构与输入完全不同,并且没有可挽救/可变的部分。 用 array_values()
清理修改后的数组只会增加时间复杂度成本。
array_map()
也必须承担时间复杂度的成本,因为 array_keys()
必须作为附加参数传入。
如果要使用
array_walk()
,请使用use()
修改结果数组。 这将使您享受尽可能低的时间复杂度。
比
array_walk()
更简洁,阅读起来更干净,我可能会在我自己的项目中使用经典的 foreach()
。
代码:(演示)
$result = [];
array_walk(
$arr,
function($row, $key) use(&$result) {
$result[] = [$key => $row['title']];
}
);
或者:
$result = [];
foreach ($arr as $key => $row) {
$result[] = [$key => $row['title']];
}
var_export($result);
或者:
var_export(array_chunk(array_map(fn($row) => $row['title'], $arr), 1, true));
你需要像使用 array_map
$new_arr= array_map(function($key,$val){
return [$key => $val['title']];},array_keys($arr),$arr);