Как вывести массив в foreach с особым вложением?
Есть массив состоящий из родительских и дочерних строк:
$arr = array(
6 => array('p_id' => 0, 'name' => 'Размер:'),
10 => array('p_id' => 6, 'name' => 'больше'),
11 => array('p_id' => 6, 'name' => 'меньше'),
29 => array('p_id' => 0, 'name' => 'Длина:'),
32 => array('p_id' => 29, 'name' => 'короче'),
33 => array('p_id' => 29, 'name' => 'длиннее'),
);
Подскажите пожалуйста, как пересобрать массив, чтобы добавить в родительские индексы дочерние строки, и привести к данному виду
Array
(
[6] => Array
(
[name] => Размер:
[item] => Array
(
[10] => больше
[11] => меньше
)
)
[29] => Array
(
[name] => Длина:
[item] => Array
(
[32] => короче
[33] => длиннее
)
)
)
Ответы (1 шт):
Автор решения: SLideR11
→ Ссылка
Если принципиально, чтобы индексы были именно такими, как у Вас в примере, то:
<?php
$arr = array(
6 => array('p_id' => 0, 'name' => 'Размер:'),
10 => array('p_id' => 6, 'name' => 'больше'),
11 => array('p_id' => 6, 'name' => 'меньше'),
29 => array('p_id' => 0, 'name' => 'Длина:'),
32 => array('p_id' => 29, 'name' => 'короче'),
33 => array('p_id' => 29, 'name' => 'длиннее'),
);
foreach($arr as $key => $val){
$arr[$key]['id'] = $key;
}
foreach($arr as $old_Arr){
if($old_Arr["p_id"] == 0){
$old_Arr["item"] = array();
$new_Arr[] = $old_Arr;
}
}
for($i = 0; $i < count($new_Arr); $i++){
foreach($arr as $old_Arr){
if($new_Arr[$i]["id"] == $old_Arr["p_id"]){
$new_Arr[$i]["item"][$old_Arr["id"]] = $old_Arr["name"];
}
}
}
foreach($new_Arr as $new){
$array[$new["id"]] = [
'name' => $new["name"],
'item' => $new["item"]
];
}
print_r($array);
Если индексы не важны, можно использовать и упорядоченные, то:
<?php
$arr = array(
6 => array('p_id' => 0, 'name' => 'Размер:'),
10 => array('p_id' => 6, 'name' => 'больше'),
11 => array('p_id' => 6, 'name' => 'меньше'),
29 => array('p_id' => 0, 'name' => 'Длина:'),
32 => array('p_id' => 29, 'name' => 'короче'),
33 => array('p_id' => 29, 'name' => 'длиннее'),
);
foreach($arr as $key => $val){
$arr[$key]['id'] = $key;
}
foreach($arr as $old_Arr){
if($old_Arr["p_id"] == 0){
$old_Arr["item"] = array();
$new_Arr[] = $old_Arr;
}
}
for($i = 0; $i < count($new_Arr); $i++){
foreach($arr as $old_Arr){
if($new_Arr[$i]["id"] == $old_Arr["p_id"]){
$new_Arr[$i]["item"][] = $old_Arr["name"];
}
}
}
print_r($new_Arr);