[英]how do I create a multidimensional associative array inside of a foreach loop?
[英]How can I create an associative array from a foreach loop?
$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
)
)
递归算法解决方案:
<?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"));
我改进了你的代码:
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);
您可以将同一函数与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);
演示: https : //eval.in/571224
当然,这是您寻求的解决方案:
<?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"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.