如何使用键值在多维阵列中移动数组?我使用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
)
)
)
)你知道怎么加入这个数组吗?
发布于 2019-04-06 15:01:22
您可以使用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
)
)
)
)发布于 2019-04-07 01:10:07
这是埃迪的答案的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()删除临时键(重新索引数组)。
https://stackoverflow.com/questions/55546628
复制相似问题