Php 如何按多维数组的键进行递归搜索?
我试图创建一个递归函数,该函数接受一个数组并查找属性名Php 如何按多维数组的键进行递归搜索?,php,arrays,json,search,recursion,Php,Arrays,Json,Search,Recursion,我试图创建一个递归函数,该函数接受一个数组并查找属性名子项,然后从匹配的数组中构造一个数组 这不是直截了当的,因为我不知道我的JSON数据的哪个块将包含键子项,所以我决定编写一个递归函数 我试过了 $testDataJson = ' { "macAddress": "10:20:30:40:50:81", "type": "HGW", "children": [{ "macAddress": "98:D6:D6:D8:FF:34", "p
子项
,然后从匹配的数组中构造一个数组
这不是直截了当的,因为我不知道我的JSON数据的哪个块将包含键子项
,所以我决定编写一个递归函数
我试过了
$testDataJson = '
{
"macAddress": "10:20:30:40:50:81",
"type": "HGW",
"children": [{
"macAddress": "98:D6:D6:D8:FF:34",
"pendingMethods": false,
"lastSeen": "2017-05-24T10:36:35",
"lastSeenLight": "GREEN",
"model": "AP7465CE-TN",
"type": "WIRELESS_ACCESS_POINT"
}, {
"macAddress": "44:66:E9:A1:2C:DC",
"pendingMethods": false,
"lastSeen": "2017-05-24T10:39:01",
"lastSeenLight": "GREEN",
"model": "PLC 200+ DIV -TN",
"type": "POWERLINE"
}, {
"macAddress": "D8:C2:A9:1C:44:47",
"pendingMethods": "False",
"lastSeen": "2017-05-24T10:39:01",
"lastSeenLight": "GREEN",
"model": "PG9073",
"type": "POWERLINE",
"children": [{
"macAddress": "22:CD:E6:8F:8C:B8",
"pendingMethods": false,
"lastSeen": "2017-05-24T10:38:16",
"lastSeenLight": "GREEN",
"model": "PG9073",
"type": "POWERLINE"
}, {
"macAddress": "13:E4:AB:33:36:AC",
"pendingMethods": false,
"lastSeen": "2017-05-24T10:29:13",
"lastSeenLight": "GREEN",
"model": "PG9072",
"type": "POWERLINE_WIRELESS_ACCESS_POINT"
}]
}]
}';
$testDataArray = json_decode($testDataJson,true);
function recursiveKeyFinder($array) {
$result = [];
if (!isset($array['children']) AND is_array($array)) {
return $result;
}else {
foreach($array['children'] as $child){
$result['macAddress'] = $child['macAddress'];
}
return recursiveKeyFinder($array);
}
}
var_dump(recursiveKeyFinder($testDataArray));
结果:var\u dump()
中没有任何内容
预期结果:
["macAddress": "98:D6:D6:D8:FF:34",
"macAddress": "44:66:E9:A1:2C:DC",
"macAddress": "D8:C2:A9:1C:44:47",
"macAddress": "22:CD:E6:8F:8C:B8",
"macAddress": "13:E4:AB:33:36:AC"]
我该如何研究这一点呢?就像Barmar siad“你有无限递归。” 这是我的解决方案。它打印出所有的mac地址
function recursiveKeyFinder($array) {
$result = [];
$result[] = $array['macAddress'];
if (isset($array['children'])) {
foreach($array['children'] as $child){
$result = array_merge($result,recursiveKeyFinder($child));
}
}
return $result;
}
这里是结果
array (size=6)
0 => string '10:20:30:40:50:81' (length=17)
1 => string '98:D6:D6:D8:FF:34' (length=17)
2 => string '44:66:E9:A1:2C:DC' (length=17)
3 => string 'D8:C2:A9:1C:44:47' (length=17)
4 => string '22:CD:E6:8F:8C:B8' (length=17)
5 => string '13:E4:AB:33:36:AC' (length=17)
希望这能像Barmar siad“你有无限递归”一样有所帮助
这是我的解决方案。它打印出所有的mac地址
function recursiveKeyFinder($array) {
$result = [];
$result[] = $array['macAddress'];
if (isset($array['children'])) {
foreach($array['children'] as $child){
$result = array_merge($result,recursiveKeyFinder($child));
}
}
return $result;
}
这里是结果
array (size=6)
0 => string '10:20:30:40:50:81' (length=17)
1 => string '98:D6:D6:D8:FF:34' (length=17)
2 => string '44:66:E9:A1:2C:DC' (length=17)
3 => string 'D8:C2:A9:1C:44:47' (length=17)
4 => string '22:CD:E6:8F:8C:B8' (length=17)
5 => string '13:E4:AB:33:36:AC' (length=17)
希望这能有所帮助PHP已经为这个操作提供了一个特定的工具:
array\u walk\u recursive()
;因此,没有必要重新发明轮子
在准备好json数据后,只需一次函数调用就可以快速、简洁地完成任务
省略第一个macAddress
(不需要的)值是通过仅将带有“children”键的子数组传递到array\u walk\u recursive()
来完成的
代码:()
结果:
array (
0 => '98:D6:D6:D8:FF:34',
1 => '44:66:E9:A1:2C:DC',
2 => 'D8:C2:A9:1C:44:47',
3 => '22:CD:E6:8F:8C:B8',
4 => '13:E4:AB:33:36:AC',
)
或者,输入阵列可以这样准备:
$array=array_diff_key(json_decode($testDataJson,true),['macAddress'=>'']);
这将确保您不会意外地获取任何非子级
macAddress
值。PHP已经为该操作提供了一个特定的工具:array\u walk\u recursive()
;因此,没有必要重新发明轮子
在准备好json数据后,只需一次函数调用就可以快速、简洁地完成任务
省略第一个macAddress
(不需要的)值是通过仅将带有“children”键的子数组传递到array\u walk\u recursive()
来完成的
代码:()
结果:
array (
0 => '98:D6:D6:D8:FF:34',
1 => '44:66:E9:A1:2C:DC',
2 => 'D8:C2:A9:1C:44:47',
3 => '22:CD:E6:8F:8C:B8',
4 => '13:E4:AB:33:36:AC',
)
或者,输入阵列可以这样准备:
$array=array_diff_key(json_decode($testDataJson,true),['macAddress'=>'']);
这将确保您不会意外地获取任何非子级
macAddress
值。您有无限递归。您正在使用给定的相同数组进行递归调用。您也永远不会返回您在foreach
循环中修改的$result
。您试图得到的结果是什么?我一到家,立即开车回家就会更新。我正在尝试返回结果数组并使函数正常工作。我将添加更多详细信息您不能同时编码和驱动吗?在这个行业你永远也做不到。:)@Barmar:我更新了我的帖子,添加了我想要的结果,我试图从我的故障递归函数中得到它。你有无限递归。您正在使用给定的相同数组进行递归调用。您也永远不会返回您在foreach
循环中修改的$result
。您试图得到的结果是什么?我一到家,立即开车回家就会更新。我正在尝试返回结果数组并使函数正常工作。我将添加更多详细信息您不能同时编码和驱动吗?在这个行业你永远也做不到。:)@Barmar:我更新了我的帖子,添加了我想要的结果,我正试图摆脱递归函数的故障。