I have this tree view of my nested array:
My questions:
I need to remove empty subarrays from this array, but array_filter()
does not do this in a nested array. How can I achieve this?
What is the right way to use a multidimensional array in my case?
How to use a nested foreach()
when I have a multidimensional array?
I have the following code:
foreach($legs as $element => $child_2){
$result .= "{'name': '".$child_2['fullname']."', 'title': '".$child_2['gcn_id']."',";
$result .= "'children': [";
foreach($child_2 as $element_1 => $child_3){
$result .="{'name': '".$child_3."', 'title': '".$child_3."',";
$result .= "'children': [";
foreach($child_3 as $element_2 => $child_4){
$result.= "{ 'name': '".$child_4."', 'title': '".$child_4."' ,";
$result .= "'children': [";
/* foreach($child_4 as $k3=>$v3){
#array_filter($v3);
$result .= "{'name': '".$v3['fullname']."', 'title': '".$v3['gcn_id']."'},";
}
*/
$result .= "]},";
}
$result .= "]},";
}
$result .= "]";
$result .= "},";
}
I have the following array:
Array(
[0] => Array
(
[gcn_id] => 11312
[fullname] => Wendy-Lynn Barr
[referral_id] => 5063
)
[1] => Array
(
[gcn_id] => 5064
[fullname] => Ed Kilgour
[referral_id] => 5063
)
[2] => Array
(
[gcn_id] => 10276
[fullname] => Joseph Melendez Motijo
[referral_id] => 5063
)
[3] => Array
(
[gcn_id] => 10050
[fullname] => DIOGENES ORTEGA
[referral_id] => 5063
)
[4] => Array
(
[gcn_id] => 10050
[fullname] => DIOGENES ORTEGA
[referral_id] => 5063
)
[5] => Array
(
[gcn_id] => 5371
[fullname] => Roberto Montero
[referral_id] => 5063
)
[6] => Array
(
[0] => Array
(
[gcn_id] => 11303
[fullname] => Pauline Blake
[referral_id] => 11312
)
[1] =>
)
[7] => Array
(
[0] => Array
(
[gcn_id] => 11302
[fullname] => Craig Corbitt
[referral_id] => 5064
)
[1] => Array
(
[0] => Array
(
[gcn_id] => 5175
[fullname] => Kristi Iles
[referral_id] => 11302
)
[1] => Array
(
[0] => Array
(
[gcn_id] => 6013
[fullname] => Joshua Iles
[referral_id] => 5175
)
[1] =>
)
[2] => Array
(
[gcn_id] => 6308
[fullname] => Chris Chowning
[referral_id] => 11302
)
[3] => Array
(
[0] => Array
(
[gcn_id] => 10039
[fullname] => Martha Rios
[referral_id] => 6308
)
[1] =>
[2] => Array
(
[gcn_id] => 10020
[fullname] => Mel Navarrette
[referral_id] => 6308
)
[3] => Array
(
[0] => Array
(
[gcn_id] => 10040
[fullname] => Aaron Thompson
[referral_id] => 10020
)
[1] =>
)
[4] => Array
(
[gcn_id] => 10013
[fullname] => April Young
[referral_id] => 6308
)
[5] =>
)
)
[2] => Array
(
[gcn_id] => 6239
[fullname] => Glen Starr
[referral_id] => 5064
)
[3] =>
[4] => Array
(
[gcn_id] => 5155
[fullname] => Allen Taylor
[referral_id] => 5064
)
[5] => Array
(
[0] => Array
(
[gcn_id] => 5309
[fullname] => Deborah Taylor
[referral_id] => 5155
)
[1] =>
)
[6] => Array
(
[gcn_id] => 5078
[fullname] => Roger Grosser
[referral_id] => 5064
)
[7] => Array
(
[0] => Array
(
[gcn_id] => 7643
[fullname] => Sam Negrete
[referral_id] => 5078
)
[1] => Array
(
[0] => Array
(
[gcn_id] => 5922
[fullname] => Claudia Negrete
[referral_id] => 7643
)
[1] =>
)
[2] => Array
(
[gcn_id] => 5319
[fullname] => Richard Phillips
[referral_id] => 5078
)
[3] =>
[4] => Array
(
[gcn_id] => 6224
[fullname] => Mike South
[referral_id] => 5078
)
[5] =>
[6] => Array
(
[gcn_id] => 5079
[fullname] => Keith Gibson
[referral_id] => 5078
)
[7] =>
[8] => Array
(
[gcn_id] => 6759
[fullname] => Lamar White
[referral_id] => 5078
)
[9] =>
[10] => Array
(
[gcn_id] => 5100
[fullname] => Sharlette Poe
[referral_id] => 5078
)
[11] =>
[12] => Array
(
[gcn_id] => 6600
[fullname] => Ohanna McKenzie
[referral_id] => 5078
)
[13] => Array
(
[0] => Array
(
[gcn_id] => 7391
[fullname] => Maria Ramm
[referral_id] => 6600
)
[1] =>
)
[14] => Array
(
[gcn_id] => 7492
[fullname] => Kyle Grosser
[referral_id] => 5078
)
[15] =>
[16] => Array
(
[gcn_id] => 10007
[fullname] => Rachael Grosser
[referral_id] => 5078
)
[17] =>
[18] => Array
(
[gcn_id] => 5122
[fullname] => Joe Simpson
[referral_id] => 5078
)
[19] => Array
(
[0] => Array
(
[gcn_id] => 5189
[fullname] => Alan Wright
[referral_id] => 5122
)
[1] =>
[2] => Array
(
[gcn_id] => 5577
[fullname] => Haley Simpson
[referral_id] => 5122
)
[3] =>
[4] => Array
(
[gcn_id] => 5167
[fullname] => Carl Troutt
[referral_id] => 5122
)
[5] => Array
(
[0] => Array
(
[gcn_id] => 5168
[fullname] => Eugene Martinez
[referral_id] => 5167
)
[1] =>
[2] => Array
(
[gcn_id] => 5168
[fullname] => Eugene Martinez
[referral_id] => 5167
)
[3] =>
)
[6] => Array
(
[gcn_id] => 7686
[fullname] => James Matthew Guy
[referral_id] => 5122
)
[7] => Array
(
[0] => Array
(
[gcn_id] => 7843
[fullname] => Ethan Guy
[referral_id] => 7686
)
[1] =>
)
[8] => Array
(
[gcn_id] => 10070
[fullname] => Rogelio Perez
[referral_id] => 5122
)
[9] =>
[10] => Array
(
[gcn_id] => 7125
[fullname] => Floyd Bowen
[referral_id] => 5122
)
[11] =>
[12] => Array
(
[gcn_id] => 7773
[fullname] => Kyle Overton
[referral_id] => 5122
)
[13] =>
[14] => Array
(
[gcn_id] => 5972
[fullname] => Kevin Farrell
[referral_id] => 5122
)
[15] =>
)
[20] => Array
(
[gcn_id] => 5689
[fullname] => Troy Shutt
[referral_id] => 5078
)
[21] =>
[22] => Array
(
[gcn_id] => 5588
[fullname] => Keith Noble
[referral_id] => 5078
)
[23] =>
[24] => Array
(
[gcn_id] => 5127
[fullname] => Stewart Allen
[referral_id] => 5078
)
[25] => Array
(
[0] => Array
(
[gcn_id] => 5448
[fullname] => Javier Ballesteros
[referral_id] => 5127
)
[1] =>
)
[26] => Array
(
[gcn_id] => 5180
[fullname] => Travis Dooley
[referral_id] => 5078
)
[27] => Array
(
[0] => Array
(
[gcn_id] => 5246
[fullname] => Fackrell's Service
[referral_id] => 5180
)
[1] => Array
(
[0] => Array
(
[gcn_id] => 5676
[fullname] => LuAnn Fackrell
[referral_id] => 5246
)
[1] =>
[2] => Array
(
[gcn_id] => 7784
[fullname] => Chad Barnhart
[referral_id] => 5246
)
[3] =>
)
[2] => Array
(
[gcn_id] => 5246
[fullname] => Fackrell's Service
[referral_id] => 5180
)
[3] => Array
(
[0] => Array
(
[gcn_id] => 5676
[fullname] => LuAnn Fackrell
[referral_id] => 5246
)
[1] =>
[2] => Array
(
[gcn_id] => 7784
[fullname] => Chad Barnhart
[referral_id] => 5246
)
[3] =>
)
[4] => Array
(
[gcn_id] => 5246
[fullname] => Fackrell's Service
[referral_id] => 5180
)
[5] => Array
(
[0] => Array
(
[gcn_id] => 5676
[fullname] => LuAnn Fackrell
[referral_id] => 5246
)
[1] =>
[2] => Array
(
[gcn_id] => 7784
[fullname] => Chad Barnhart
[referral_id] => 5246
)
[3] =>
)
[6] => Array
(
[gcn_id] => 5246
[fullname] => Fackrell's Service
[referral_id] => 5180
)
[7] => Array
(
[0] => Array
(
[gcn_id] => 5676
[fullname] => LuAnn Fackrell
[referral_id] => 5246
)
[1] =>
[2] => Array
(
[gcn_id] => 7784
[fullname] => Chad Barnhart
[referral_id] => 5246
)
[3] =>
)
)
[28] => Array
(
[gcn_id] => 5166
[fullname] => Adan Mosqueda
[referral_id] => 5078
)
[29] =>
[30] => Array
(
[gcn_id] => 5349
[fullname] => EDMOND WILSON
[referral_id] => 5078
)
[31] => Array
(
[0] => Array
(
[gcn_id] => 7380
[fullname] => Rich Anderson
[referral_id] => 5349
)
[1] =>
[2] => Array
(
[gcn_id] => 7346
[fullname] => Peter Smith
[referral_id] => 5349
)
[3] =>
[4] => Array
(
[gcn_id] => 6722
[fullname] => Larry Schaben
[referral_id] => 5349
)
[5] => Array
(
[0] => Array
(
[gcn_id] => 7148
[fullname] => Cam Callender
[referral_id] => 6722
)
[1] => Array
(
[0] => Array
(
[gcn_id] => 7313
[fullname] => Sherrie Callender
[referral_id] => 7148
)
[1] =>
)
[2] => Array
(
[gcn_id] => 10009
[fullname] => Kathy Schaben
[referral_id] => 6722
)
[3] =>
)
[6] => Array
(
[gcn_id] => 10011
[fullname] => Cornelius Reed
[referral_id] => 5349
)
[7] =>
)
[32] => Array
(
[gcn_id] => 5320
[fullname] => Joe Coon
[referral_id] => 5078
)
[33] => Array
(
[0] => Array
(
[gcn_id] => 5573
[fullname] => Denise Coon
[referral_id] => 5320
)
[1] =>
)
[34] => Array
(
[gcn_id] => 10168
[fullname] => Jerry Curtis
[referral_id] => 5078
)
[35] =>
)
[8] => Array
(
[gcn_id] => 5310
[fullname] => Rodney Licari
[referral_id] => 5064
)
[9] => Array
(
[0] => Array
(
[gcn_id] => 6041
[fullname] => Bryan Russel Sevrence
[referral_id] => 5310
)
[1] =>
)
[10] => Array
(
[gcn_id] => 5097
[fullname] => James Yates
[referral_id] => 5064
)
[11] => Array
(
[0] => Array
(
[gcn_id] => 10045
[fullname] => Christopher Edwards
[referral_id] => 5097
)
[1] =>
[2] => Array
(
[gcn_id] => 7193
[fullname] => Ed Kilgour
[referral_id] => 5097
)
[3] =>
[4] => Array
(
[gcn_id] => 5647
[fullname] => Talonda Yates
[referral_id] => 5097
)
[5] =>
[6] => Array
(
[gcn_id] => 6228
[fullname] => Calvin Pearson
[referral_id] => 5097
)
[7] =>
[8] => Array
(
[gcn_id] => 10105
[fullname] => Marsha Wade
[referral_id] => 5097
)
[9] =>
[10] => Array
(
[gcn_id] => 5677
[fullname] => Brenda Joyner
[referral_id] => 5097
)
[11] =>
[12] => Array
(
[gcn_id] => 7670
[fullname] => Bonny Lewis
[referral_id] => 5097
)
[13] =>
[14] => Array
(
[gcn_id] => 5231
[fullname] => Brent Coursey
[referral_id] => 5097
)
[15] =>
[16] => Array
(
[gcn_id] => 5971
[fullname] => James Yates, II
[referral_id] => 5097
)
[17] =>
[18] => Array
(
[gcn_id] => 5602
[fullname] => Glenn Yates
[referral_id] => 5097
)
[19] =>
[20] => Array
(
[gcn_id] => 10004
[fullname] => Sarah Williams
[referral_id] => 5097
)
[21] =>
[22] => Array
(
[gcn_id] => 10004
[fullname] => Sarah Williams
[referral_id] => 5097
)
[34] => Array
(
[gcn_id] => 7041
[fullname] => Lamont Bartlett
[referral_id] => 5097
)
[35] =>
[36] => Array
(
[gcn_id] => 0
[fullname] => Eric Haut
[referral_id] => 5097
)
[37] =>
)
)
)
The desired output for the above input would start like this:
{
"children": [{
"name": "Wendy-Lynn Barr",
"title": "11312",
"children": [{
"name": "Pauline Blake",
"title": "11303",
"children":[{
"name":"Pauline Blake",
"title":"11312",
}]
}]
},{
"title": "5064",
"name": "Ed Kilgour",
"referral_id": "5063",
'children': [{
'name': 'Glen Starr',
'title': '6239'
},{
'name': 'Allen Taylor',
'title': '5155'
},{
'name': 'Roger Grosser',
'title': '5078'
},{
'name': 'Rodney Licari',
'title': '5310'
},{
'name': 'Craig Corbitt',
'title':'11302'
},{
'name': 'James Yates',
'title': '5097'
}]
},
{ /* ...etc */ },
]
}
Indeed array_filter
does not work recursively.
Here is a recursive function that does the job of taking out null
values:
function array_filter_recursive($arr, $cb = null) {
if (empty($cb)) {
$cb = function ($el) {
return $el;
};
}
$result = [];
foreach($arr as $key => $val) {
if (is_array($val)) $val = array_filter_recursive($val, $cb);
if ($cb($val)) $result[$key] = $val;
}
return $result;
}
In general you need recursion (a function that calls itself) to solve problems involving arbitrary deeply nested arrays.
Now to your actual desired output (which I transferred from your comments into your question): that looks like JSON, for which you can use json_encode
. There should never be a reason to build such a string yourself.
So you should never write something like this:
$result.= "{ 'name': '".$child_4."', 'title': '".$child_4."' ,";
For generating the specific output you are looking for, you could use this function:
function convert($arr) {
$result = [];
$byId = [];
function recurse(&$result, &$byId, $arr) {
if (!is_array($arr)) return;
if (isset($arr["gcn_id"])) {
$parent = $arr["referral_id"];
$record = [
"name" => $arr["fullname"],
"title" => $arr["gcn_id"]
];
$byId[$arr["gcn_id"]] = &$record;
if (isset($byId[$parent])) {
$byId[$parent]["children"][] = &$record;
} else {
$result[] = &$record;
}
} else {
foreach($arr as $child) {
recurse($result, $byId, $child);
}
}
}
recurse($result, $byId, $arr);
return $result;
}
$result = json_encode(convert($legs), JSON_PRETTY_PRINT);
echo $result;
See it run on eval.in. It produces this output:
[
{
"name": "Wendy-Lynn Barr",
"title": 11312,
"children": [
{
"name": "Pauline Blake",
"title": 11303
}
]
},
{
"name": "Ed Kilgour",
"title": 5064,
"children": [
{
"name": "Craig Corbitt",
"title": 11302,
"children": [
{
"name": "Kristi Iles",
"title": 5175,
"children": [
{
"name": "Joshua Iles",
"title": 6013
}
]
},
{
"name": "Chris Chowning",
"title": 6308,
"children": [
// ...etc
The key here is not only recursion, but also referencing a record by its ID (title). This referencing can be done with the &
symbol, both in function parameters and in assignments.