比如说我有以下数组:
$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
)
)
这就是我现在所处的位置,似乎无法弄清楚如何处理数组的其余部分,或任何大小的数组。
任何提示//评论都会受到赞赏。
答案 0 :(得分:1)
你不能在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;
}
答案 1 :(得分:0)
您可以使用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
答案 2 :(得分:0)
虽然我必须赞扬@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
找不到太多文档,但这里显示了一些示例:Anonymous Functions。