例如,假设我有以下数组:
$h = array (
"app" => array (
"level1" => array (
"level2" => array (
"level3" =>3
),
"level4" => array (
"level5" => 2
)
)
)
);
我想做的是为这里找到的每个子数组创建一个字符串。例如,使用上面的数组,输出将是:
Array
(
[0] => Array
(
[app.level1.level2.level3] => 3
)
[1] => Array
(
[app.level1.level4.level5] => 2
)
)
如您所见,每个子数组都与一个'.'
连接,以表示存在一个子数组的事实,该子数组具有由最后一个节点分配的值。当然,我唯一能想到的就是创建一个可以处理这个问题的递归函数,尽管这是我在这里遇到一些麻烦的地方。以下是我开始的工作:
public static function buildString($array, $string ="") {
foreach($array as $h => $k) {
if(is_array($k)) {
$string .= $h.".";
return self::buildString($k, $string);
} else {
$string .= $h;
$j[] = array (
$string => $k
);
return $j;
}
}
}
在此方法中输入上面给出的数组,我成功获得了第一次迭代:
Array
(
[0] => Array
(
[app.level1.level2.level3] => 3
)
)
这就是我目前所处的位置,似乎无法弄清楚如何完成数组的其余部分或任何大小的数组。
任何提示//备注将不胜感激。
你不能在foreach循环中返回,你需要聚合所有递归/非递归结果并将它们冒泡。像这样:
public static function buildString($array, $string ="") {
$j = array();
foreach($array as $h => $k) {
if(is_array($k)) {
$string .= $h.".";
$j = array_merge($j, self::buildString($k, $string));
} else {
$string .= $h;
$j[] = array (
$string => $k
);
}
}
return $j;
}
您可以使用array_walk()
作为方法:
$h = array (
"app" => array (
"level1" => array (
"level2" => array (
"level3" =>3
),
"level4" => array (
"level5" => 2
)
)
)
);
$results = array();
function get_strings($item, $key, $old_key = null) {
global $results;
if(is_array($item)) {
array_walk($item, 'get_strings', $old_key . $key . ".");
} else {
$results[$old_key . $key] = $item;
}
}
array_walk($h, 'get_strings');
print_r($results); //returns Array ( [app.level1.level2.level3] => 3 [app.level1.level4.level5] => 2 )
array_walk() 文档:http://php.net/manual/en/function.array-walk.php
虽然我必须感谢@kennypu,但我对答案做了一些轻微的修改,以便将代码包含在一个函数中,而无需使用类中的global
或任何其他变量(将其全部保存在一种方法中)。
public static function buildString($array, $delimeter = '.') {
$results = array();
$func = function($item, $key, $old_key = NULL) use (&$func, &$results, $delimeter) {
if(is_array($item)) {
array_walk($item, $func, $old_key . $key . $delimeter);
} else {
$results[$old_key . $key] = $item;
}
};
array_walk($array, $func);
return $results;
}
从本质上讲,我创建了一个匿名函数,该函数使用来自父级的参数,并使用关键字use
。虽然找不到太多的文档use
但这里显示了一些示例:匿名函数。