[英]PHP foreach in special array
我需要一些帮助来遍历一个嵌套数组中的所有值。 我需要将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)的区别。 是问题
有任何想法吗?
我做的事情有些不同。 我不知道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);
}
}
}
不过,订单将与您的订单不同。
由于您不使用第一个参数,因此我将其删除并重新组织了代码。 想法是您从元素获取并输出当前项目。 然后,如果子元素中有元素,则将此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 );
}
我已经尝试使用您的数据子集对此进行测试,并且似乎可以生成它,但是您将必须对其进行检查,并让我知道是否存在特定的错误。
我看到了以下问题:您从未发送过新的$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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.