$array = ["farm"=>
[
"horse"=>
[
"rabbit"=>
[
"fred1"=> "fred1",
"fred2"=> "fred2",
"fred3"=> "fred3",
"fred4"=> "fred4"
],
"raccoon"=>
["frida"=> "frida"]
]
]
];
我想为每个循环创建一个数组:
$keySearch = "o";
function createList($array, $keySearch, $path) {
foreach ($array as $key => $item) {
$basePath = $path === null ? $key : $path. "/" . $key;
if(is_array($item)){
if (stripos($key, $keySearch) !== false){
$a['key'] = $key ;
$b['basePath'] = $basePath;
$result[] = array_merge_recursive ($a, $b);
}
createList($item, $keySearch, $basePath);
}
}
print_r($result);
}
createList($array, $keySearch, '');
我的结果是:
Array
(
[0] => Array
(
[key] => horse
[basePath] => farm/horse
)
)
Array
(
[0] => Array
(
[key] => raccoon
[basePath] => farm/horse/raccoon
)
)
我的期望是:
Array
(
[0] => Array
(
[key] => horse
[basePath] => farm/horse
)
[1] => Array
(
[key] => raccoon
[basePath] => farm/horse/raccoon
)
)
答案 0 :(得分:1)
递归算法解决方案:
<?php
$array = ["farm"=>
[
"horse"=>
[
"rabbit"=>
[
"fred1"=> "fred1",
"fred2"=> "fred2",
"fred3"=> "fred3",
"fred4"=> "fred4"
],
"raccoon"=>
["john"=> "john"]
]
]
];
$jl = array();
$root = "";
function walkJarLarsData($ar, $search, $base="base-path", $pKey=""){
global $jl, $root;
if(!stristr($root, $base)){
$root .= $base;
}
foreach($ar as $key=>$val){
$pKey = $pKey?"{$pKey}":"";
if (preg_match("#" . preg_quote($search) . "#", $key)) {
$jl[] = array(
"key" => $key,
"basePath" => $root . "/{$pKey}/{$key}",
);
}
if(is_array($val)){
walkJarLarsData($val, $search, $base, $key);
}
}
return $jl;
}
var_dump(walkJarLarsData($array, "o"));
答案 1 :(得分:1)
我改进了你的代码:
function createList($array, $keySearch, $path=null) {
$result = [];
foreach ($array as $key => $item) {
$basePath = $path === null ? $key : $path. "/" . $key;
if(is_array($item)){
if (stripos($key, $keySearch) !== false) {
$result[] = ['key' => $key, 'basePath' => $basePath];
}
$result = array_merge($result, createList($item, $keySearch, $basePath));
}
}
return $result;
}
$keySearch = 'o';
$res = createList($array, $keySearch);
print_r($res);
UPD:如果找到所有键,不仅是那些指向数组的键,那么改变代码:
function createList($array, $keySearch, $path=null) {
$result = [];
foreach ($array as $key => $item) {
$basePath = $path === null ? $key : $path. "/" . $key;
if (stripos($key, $keySearch) !== false)
$result[] = ['key' => $key, 'basePath' => $basePath];
if(is_array($item))
$result = array_merge($result, createList($item, $keySearch, $basePath));
}
return $result;
}
$keySearch = 'fr';
$res = createList($array, $keySearch);
print_r($res);
答案 2 :(得分:1)
您可以将同一函数与add ref属性一起使用,并将数组追加到该属性中。
$array = ["farm"=>
[
"horse"=>
[
"rabbit"=>
[
"fred1"=> "fred1",
"fred2"=> "fred2",
"fred3"=> "fred3",
"fred4"=> "fred4"
],
"raccoon"=>
["frida"=> "frida"]
]
]
];
function createList($array, $keySearch, $path, &$out) {
foreach ($array as $key => $item) {
$basePath = $path === null ? $key : $path. "/" . $key;
if(is_array($item)){
if (stripos($key, $keySearch) !== false){
$a['key'] = $key ;
$b['basePath'] = $basePath;
$out[] = array_merge_recursive ($a, $b);
}
createList($item, $keySearch, $basePath, $out);
}
}
}
$keySearch = "o";
createList($array, $keySearch, '', $result);
print_r($result);
答案 3 :(得分:1)
<?php
$arBase = array();
$kern = "";
function arrayRecurse($ar, $search, $mainPath="base-path", $cue=""){
global $arBase, $kern;
$kern = !(stristr($kern, $mainPath))? $kern.= $mainPath : $kern;
foreach($ar as $key=>$val){
$cue = $cue?"{$cue}":"";
if (preg_match("#" . preg_quote($search) . "#", $key)) {
$arBase[] = array(
"key" => $key,
"basePath" => $kern . "/{$cue}/{$key}",
);
}
if(is_array($val)){
arrayRecurse($val, $search, $mainPath, $key);
}
}
return $arBase;
}
var_dump(arrayRecurse($array, "fr"));