我需要一些帮助来遍历一个嵌套数组中的所有值。我需要将ID恢复到数组中,并将ID从父数组中恢复。第一层必须是parent_id = 0,订单是来自父数组的ID。
Array
(
[0] => Array
(
[id] => 3
[children] => Array
(
[0] => Array
(
[id] => 13
)
[1] => Array
(
[id] => 48
[children] => Array
(
[0] => Array
(
[id] => 52
)
[1] => Array
(
[id] => 61
)
)
)
)
)
[1] => Array
(
[id] => 10
[children] => Array
(
[0] => Array
(
[id] => 54
[children] => Array
(
[0] => Array
(
[id] => 55
[children] => Array
(
[0] => Array
(
[id] => 56
)
)
)
)
)
)
)
)
我正在使用以下PHP脚本恢复数据:
function readClass($k, $v, &$parent_id, &$new_id, &$order_id ) {
$out = "";
if (!is_array($v)) {
$out .= "<li>id:$v | parent_id:$parent_id | order:$order_id ";
if (($parent_id == "0") || ($new_id == "S")) {
$parent_id = $v;
$new_id = 'N';
}
} else {
foreach($v as $k2=>$v2) {
$order_id++;
$out .= readClass($k2, $v2, $parent_id, $new_id, $order_id);
}
}
return $out;
}
foreach($someArray as $key=>$value) {
$parent_id = '0';
$order_id = '0';
$new_id = 'N';
echo readClass($key, $value, $parent_id, $new_id, $order_id );
}
结果是:
id:3 | parent_id:0 | order:1
id:13 | parent_id:3 | order:4
id:48 | parent_id:3 | order:6
id:52 | parent_id:3 | order:9
id:61 | parent_id:3 | order:11
id:10 | parent_id:0 | order:1
id:54 | parent_id:10 | order:4
id:55 | parent_id:10 | order:7
id:56 | parent_id:10 | order:10
我想这样恢复:
id:3 | parent_id:0 | order:1
id:13 | parent_id:3 | order:4
id:48 | parent_id:3 | order:6
id:52 | parent_id:48 | order:9
id:61 | parent_id:48 | order:11
id:10 | parent_id:0 | order:1
id:54 | parent_id:10 | order:4
id:55 | parent_id:54 | order:7
id:56 | parent_id:55 | order:10
请注意parent_id与id(52,61,55,56)的区别。是问题所在...
有什么想法吗?
答案 0 :(得分:0)
我做的事情有些不同。我不知道new_id的用途是什么,但我认为您的代码中没有使用它。
您要遍历数组中的每个项目,而不是了解结构并解决该问题。
以下代码段仅对每个项目进行迭代,只要有子项目,就继续向下进行操作,从而更新parentId。
function readClass($arr,$parentId = 0,&$order = 0){
echo $arr['id'] . ', ' . $parentId . ', ' . $order . "\n";
if(isset($arr['children'])){
foreach($arr['children'] as $child){
$order++;
readClass($child,$arr['id'],$order);
}
}
}
但是订单不会与您的订单相同。
答案 1 :(得分:0)
由于您不使用第一个参数,因此我将其删除并重新组织了很多代码。想法是您从元素获取并输出当前项目。然后,如果子元素中包含元素,则将此ID传递给递归调用并处理每个子元素...
function readClass( $v, $parent_id, &$new_id, &$order_id ) {
$out = "";
$order_id++;
$out .= "<li>id:$v[id] | parent_id:$parent_id | order:$order_id ";
if ( isset($v["children"]) ) {
$parent_id = $v["id"];
foreach ( $v["children"] as $children ) {
$out .= readClass( $children, $parent_id, $new_id, $order_id);
}
}
return $out;
}
foreach($someArray as $key=>$value) {
$parent_id = '0';
$order_id = '0';
$new_id = 'N';
echo readClass($value, $parent_id, $new_id, $order_id );
}
我已经尝试使用您的数据子集对此进行测试,并且似乎可以生成该数据,但是您必须进行检查并让我知道是否存在特定错误。
答案 2 :(得分:0)
我看到了以下问题:您从未发送过新的$parent_id
。因此,我对readClass
函数进行了更改:
function readClass($k, $v, &$parent_id, &$new_id, &$order_id ) {
$out = "";
if (!is_array($v)) {
$out .= "<li>id:$v | parent_id:$parent_id | order:$order_id ";
if (($parent_id == "0") || ($new_id == "S")) {
$parent_id = $v;
$new_id = 'N';
}
} else {
$old_value2 = 0;
foreach($v as $k2=>$v2) {
if($k2 === "children") // -- If the current index is children(They will need a new father)
$parent_id = $old_value2;
$order_id++;
$out .= readClass($k2, $v2, $parent_id, $new_id, $order_id);
$old_value2 = $v2; // -- We always set the old one as the new father in case he has childrens
}
}
return $out;
}