如何在具有键值的多维数组中移动数组? 我正在使用array_push将值添加到多维数组。我有一个数组
$myArray = Array(Array('code' => '1','room' => Array('name' => 'Room-A')),Array('code' =>'1','room' => Array('name' => 'Room-B'
)), Array('code' => '2','room' => Array('name' => 'Vip-1')),Array('code' => '2','room' => Array('name' => 'Vip-2')));
我尝试使用如下代码:
for ($i=0; $i <count($myArray) ; $i++) {
if ($myArray[$i]['code']=='1') {
array_push($myArray[$i]['room'], $myArray[$i]['room']);
}
else{
array_push($myArray[$i]['room'], $myArray[$i]['room']);
}
}
我想要这样的结果:
Array
(
[0] => Array
(
[code] => 1
[room] => Array
(
[0] => Array
(
[name] => Room-A
)
[1] => Array
(
[name] => Room-B
)
)
)
[1] => Array
(
[code] => 2
[room] => Array
(
[0] => Array
(
[name] => Vip-1
)
[1] => Array
(
[name] => Vip-2
)
)
)
)
有什么想法如何加入这个数组吗?
答案 0 :(得分:1)
您可以使用array_reduce
使用代码作为键将数组汇总为一个关联数组。使用array_values
将关联数组转换为简单数组。
$myArray = ....
$result = array_values(array_reduce($myArray, function($c, $v){
if ( !isset( $c[ $v['code'] ] ) ) $c[ $v['code'] ] = array( 'code' => $v['code'], 'room' => array() );
$c[ $v['code'] ]['room'][] = $v['room'];
return $c;
},array()));
echo "<pre>";
print_r( $result );
echo "</pre>";
这将导致:
Array
(
[0] => Array
(
[code] => 1
[room] => Array
(
[0] => Array
(
[name] => Room-A
)
[1] => Array
(
[name] => Room-B
)
)
)
[1] => Array
(
[code] => 2
[room] => Array
(
[0] => Array
(
[name] => Vip-1
)
[1] => Array
(
[name] => Vip-2
)
)
)
)
答案 1 :(得分:0)
这相当于埃迪(Eddie)的答案的foreach()
(我发现它更易于阅读/维护)。
代码:(Demo)
$myArray = [
['code' => '1', 'room' => ['name' => 'Room-A']],
['code' => '1', 'room' => ['name' => 'Room-B']],
['code' => '2', 'room' => ['name' => 'Vip-1']],
['code' => '2', 'room' => ['name' => 'Vip-2']]
];
foreach ($myArray as $row) {
if (!isset($result[$row['code']])) {
$result[$row['code']] = ['code' => $row['code'], 'room' => [$row['room']]];
// ^------------^-- pushed deeper
} else {
$result[$row['code']]['room'][] = $row['room'];
// ^^-- pushed deeper
}
}
var_export(array_values($result));
此问题与许多现有问题想要按特定列分组。我找不到确切的重复项,因为此问题的要求是创建一个更深的结构以包含room
子数组。
我通常会这样写:
if (!isset($result[$row['code']])) {
$result[$row['code']] = $row;
减少语法,但是新的输出结构必须同时应用于if
和else
。
为避免按键重复/冲突,需要将房间子阵列推入/索引到较低级别。
最后,该技术已在StackOverflow上进行了很多次演示。您可以将元素值作为分组依据,并在迭代输入数组时将该值用作临时键。检查临时密钥是否存在是确定组是新的还是以前遇到的最快方法。完成后,调用array_values()
删除临时键(重新索引数组)。