扁平化多维数组 1 级 php



我正在为类别构建层次结构。

我正在使用递归函数来构建子父关系。这将为每个子级构建一组嵌套数组。

我想将这个嵌套数组扁平化到 1 级。有很多方法可以完全展平多维数组,但我想为 JSON 重建数组,在数组中一起维护每个类别 id名称

我得到这个输出:

array(2) { 
[0] => array(2) {
["id"] => int(223)    
["name"] => string(12) "child of top" 
["parent"] => int(222)
}  
[1] => array(1) {    
[0]=> array(2) {      
[id] => int(224)      
["name"] => string(21) "child of child of top"    
["parent"] => int(222)
}
}
}

但我希望有:

array(2) { 
[0] => array(2) {
["id"] => int(223)    
["name"] => string(12) "child of top" 
["parent"] => int(222)
}  
[1] => array(2) {      
["id"] => int(224)      
["name"] => string(21) "child of child of top"
["parent"] => int(223)
}
}

然后,我可以将其构建到正确的子父关系中。

这是我第一次构建这种结构,所以我对尝试正确格式化事物有点不知所措。

有什么建议可以推进吗? 谢谢。

编辑添加的功能

function display_children($cat_id, $level) { 
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die ("Error " . mysqli_error($conn));
$stmt = $mysqli->prepare("SELECT id, content, parent_id 
FROM table
WHERE parent_id = ?
");
$stmt->bind_param("i", $cat_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
while( $row = $result->fetch_assoc() ) {
$data_array[] = $row; 
$data_array[] = display_children($row['id'], $level+1);
}
return $data_array;
}

更多信息第一个建议的答案并不完全存在,因为所有级别的子级别都没有返回到父级别。

parent: int(229)n
recursion[0]: array(3) {n  ["id"]=>n  int(232)n  ["content"]=>n  string(7) "level 4"n  ["parent_id"]=>n  int(231)n}n
array(2) {n    [0]=>n  array(3) {n    ["id"]=>n    int(231)n    ["content"]=>n    string(7) "level 3"n    ["parent_id"]=>n    int(229)n  }n  
[1]=>n  array(3) {n    ["id"]=>n    int(232)n    ["content"]=>n    string(7) "level 4"n    ["parent_id"]=>n    int(231)n  }n}n 
parent: int(228)n
recursion[0]: array(3) {n  ["id"]=>n  int(231)n  ["content"]=>n  string(7) "level 3"n  ["parent_id"]=>n  int(229)n}n
array(2) {n    [0]=>n  array(3) {n    ["id"]=>n    int(229)n    ["content"]=>n    string(7) "level 2"n    ["parent_id"]=>n    int(228)n  }n  
[1]=>n  array(3) {n    ["id"]=>n    int(231)n    ["content"]=>n    string(7) "level 3"n    ["parent_id"]=>n    int(229)n  }n}n 
parent: int(227)n
recursion[0]: array(3) {n  ["id"]=>n  int(229)n  ["content"]=>n  string(7) "level 2"n  ["parent_id"]=>n  int(228)n}n
array(2) {n    [0]=>n  array(3) {n    ["id"]=>n    int(228)n    ["content"]=>n    string(7) "level 1"n    ["parent_id"]=>n    int(227)n  }n  
[1]=>n  array(3) {n    ["id"]=>n    int(229)n    ["content"]=>n    string(7) "level 2"n    ["parent_id"]=>n    int(228)n  }n}n

JSON 的最终输出:

[{"id":228,"content":"level 1","parent_id":227},{"id":229,"content":"level 2","parent_id":228}]"

在循环中使用此检查:

if( isset( $recursion[0] ) ){
$data_array[] = $recursion[0];
echo " parent: ";
var_dump($cat_id)
echo "recursion[0]: " 
var_dump( $recursion[0], $data_array);
}

我想我有答案:

if( isset( $recursion[1] ) ){
$data_array = array_merge($recursion,$data_array);
} elseif ( isset( $recursion[0] ) ){
$data_array[] = $recursion[0];
}

如果递归返回中的值超过 1 个,则有子项的子项在递归中返回。 不仅仅是当前父母的孩子。需要返回整个递归数组。然后将数组与当前父级合并。我还没有粗略地测试过这个,但似乎进展顺利。

如果结构是作为示例,这应该可以工作:

function display_children($cat_id, $level) { 
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die ("Error " . mysqli_error($conn));
$stmt = $mysqli->prepare("SELECT id, content, parent_id 
FROM table
WHERE parent_id = ?
");
$stmt->bind_param("i", $cat_id);
$stmt->execute();
$result = $stmt->get_result();
$stmt->close();
while( $row = $result->fetch_assoc() ) {
$data_array[] = $row; 
$recursion = display_children($row['id'], $level+1);
if(isset($recursion['id']))
$data_array[] = $recursion;
elseif(isset($recursion[0]))
$data_array[] = $recursion[0];
else
//manage error
}
return $data_array;
}

最新更新