展平多维数组 1 级 php
Flatten multidimensional array 1 level php
我正在为类别构建层次结构。
我正在使用递归函数来建立 child parent 关系。这为每个 child.
构建了一组嵌套数组
我想将这个嵌套数组展平到 1 层。有很多方法可以完全展平多维数组,但我想为 JSON 重建数组,维护每个 category id 和 name一起在数组中。
我得到这个输出:
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)
}
}
然后我可以构建正确的 child parent 关系。
这是我第一次构建这种结构,所以我对尝试正确设置格式有点不知所措。
有什么建议可以推进这项工作吗?谢谢。
编辑 添加函数
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;
}
更多信息
第一个建议的答案并不完全存在,因为所有级别的 children 都没有被 return 提升到 parent 级别。
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];
}
如果递归 return 中有超过 1 个值,则 children 中的 children 被 returned 递归。不仅仅是当前 parent 的 child。需要 return 整个递归数组。然后将数组与当前parent合并。我还没有对此进行彻底的测试,但似乎进展顺利。
如果结构如示例所示,这应该有效:
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;
}
我正在为类别构建层次结构。
我正在使用递归函数来建立 child parent 关系。这为每个 child.
构建了一组嵌套数组我想将这个嵌套数组展平到 1 层。有很多方法可以完全展平多维数组,但我想为 JSON 重建数组,维护每个 category id 和 name一起在数组中。
我得到这个输出:
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)
}
}
然后我可以构建正确的 child parent 关系。
这是我第一次构建这种结构,所以我对尝试正确设置格式有点不知所措。
有什么建议可以推进这项工作吗?谢谢。
编辑 添加函数
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;
}
更多信息 第一个建议的答案并不完全存在,因为所有级别的 children 都没有被 return 提升到 parent 级别。
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];
}
如果递归 return 中有超过 1 个值,则 children 中的 children 被 returned 递归。不仅仅是当前 parent 的 child。需要 return 整个递归数组。然后将数组与当前parent合并。我还没有对此进行彻底的测试,但似乎进展顺利。
如果结构如示例所示,这应该有效:
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;
}