Php 如何从foreach循环创建关联数组?
我想从我的for each循环创建一个数组:Php 如何从foreach循环创建关联数组?,php,arrays,multidimensional-array,associative-array,Php,Arrays,Multidimensional Array,Associative Array,我想从我的for each循环创建一个数组: $array = ["farm"=> [ "horse"=> [ "rabbit"=> [ "fred1"=> "fred1", "fred2"=> "fred2"
$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"));
UPD:如果您找到所有键,而不仅仅是那些指向数组的键,请更改代码以便:
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);
您可以对addition ref属性使用相同的函数,并将数组附加到该属性中
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);
演示:毫无疑问,这是您寻求的解决方案:
$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);
您的输出与预期输出之间的差异有多大?@splash58我的输出是两个数组,但我只需要一个数组$keySearch?在这种情况下,是$keySearch=“o”
为什么john不在结果中?例如,如果数组中有key=>值,则第一个代码不会选择它,第二个代码会选择它,。但是$key=>[array]在这两种情况下都会出现
<?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"));