我需要展平 PHP 数组,但在获得所需结果时遇到一些问题。
Array
(
[0] => Array
(
[case_code_id] => 1
[parent_id] => 0
[case_code] => Main A
[sub_codes] => Array
(
[0] => Array
(
[case_code_id] => 3
[parent_id] => 1
[case_code] => Sub A
[sub_codes] => Array
(
[0] => Array
(
[case_code_id] => 5
[parent_id] => 3
[case_code] => Sub Sub A
[sub_codes] => Array
(
)
)
)
)
[1] => Array
(
[case_code_id] => 4
[parent_id] => 1
[case_code] => Sub B
[sub_codes] => Array
(
)
)
)
)
[1] => Array
(
[case_code_id] => 2
[parent_id] => 0
[case_code] => Main B
[sub_codes] => Array
(
)
)
)
但我想将其转换为以下内容:
Array
(
[0] => Array
(
[case_code_id] => 1
[parent_id] => 0
[case_code] => Main A
)
[1] => Array
(
[case_code_id] => 3
[parent_id] => 1
[case_code] => Sub A
)
[2] => Array
(
[case_code_id] => 5
[parent_id] => 3
[case_code] => Sub Sub A
)
[3] => Array
(
[case_code_id] => 4
[parent_id] => 1
[case_code] => Sub B
)
[4] => Array
(
[case_code_id] => 2
[parent_id] => 0
[case_code] => Main B
[sub_codes] => Array
)
我尝试了几个循环,但没有返回完整的数组。
这是我的循环:
public function array_flatten($array,$list=array()){
for ($i=0;$i<count($array);$i++) {
$results[] = array(
'case_code_id'=>$array[$i]['case_code_id'],
'case_code'=>$array[$i]['case_code'],
'parent_id'=>$array[$i]['parent_id']
);
if (count($array[$i]['sub_codes']) > 0) {
$this->array_flatten($array[$i]['sub_codes'],$results);
} else {
$results[] = $array[$i];
}
}
return $results;
}
我这样称呼它:($multi 包含多维数组)
$flat = $this->array_flatten($multi);
变量 $multi 是从此函数创建的:
public function build_case_code_tree(array $elements, $parentId = 0) {
$branch = array();
foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = $this->build_case_code_tree($elements, $element['case_code_id']);
$element['sub_codes'] = $children;
$branch[] = $element;
}
}
return $branch;
}
有什么想法吗?
function array_flatten($a, $flat = []) {
$entry = [];
foreach ($a as $key => $el) {
if (is_array($el)) {
$flat = array_flatten($el, $flat);
} else {
$entry[$key] = $el;
}
}
if (!empty($entry)) {
$flat[] = $entry;
}
return $flat;
}
print_r(array_flatten($multi));
您没有在代码中的任何地方使用
$list
,并且没有任何内容通过引用传递。
你已经很接近了,但是你的函数应该使用 $list
代替 $results
,并且它应该通过引用接收 $list
并就地修改它而不是返回它。
类似这样的东西(虽然未经测试):
function array_flatten($array,&$list=array()){
for ($i=0;$i<count($array);$i++) {
$list[] = array(
'case_code_id'=>$array[$i]['case_code_id'],
'case_code'=>$array[$i]['case_code'],
'parent_id'=>$array[$i]['parent_id']
);
if (count($array[$i]['sub_codes']) > 0) {
$this->array_flatten($array[$i]['sub_codes'],$list);
} else {
$list[] = $array[$i];
}
}
}
并这样称呼它:
$flat = Array();
$this->array_flatten($multi, $flat);
// Result is inside $flat now
如果子级为空,则将返回一个空数组。如果一个空数组作为
array_push()
的参数“传播”,则不会向数组添加任何内容。由于自定义函数调用仅返回子集的线性数组,因此在
array_push()
内部使用扩展运算符意味着递归调用永远不会创建不需要的深度。代码:(
演示)
function flatten(array $array): array
{
$result = [];
foreach ($array as $v) {
$subCode = $v['sub_codes'];
unset($v['sub_codes']);
array_push(
$result,
$v,
...flatten($subCode)
);
}
return $result;
}
var_export(flatten($array));