我有我的嵌套数组的树视图:
我的问题:
array_filter()
不会在嵌套数组中执行此操作。我怎样才能做到这一点?foreach()
?我有以下代码:
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 .= "},";
}
我有以下数组:
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] =>
)
)
)
上述输入的所需输出将如下所示:
{
"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 */ },
]
}
确实array_filter
不能递归地工作。
这是一个递归函数,可以取出null
值:
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;
}
通常,您需要递归(一个调用自身的函数)来解决涉及任意深度嵌套数组的问题。
现在到你实际需要的输出(我从你的评论转移到你的问题):看起来像JSON,你可以使用json_encode
。永远不应该有理由自己构建这样的字符串。
所以你永远不应该写这样的东西:
$result.= "{ 'name': '".$child_4."', 'title': '".$child_4."' ,";
要生成您正在寻找的特定输出,您可以使用此功能:
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;
看它在eval.in上运行。它产生这个输出:
[
{
"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
这里的关键不仅是递归,还通过其ID(标题)引用记录。可以使用&
符号在函数参数和赋值中完成此引用。