将多维数组转换为一系列字符串


Converting a multidimensional array into a series of strings

例如,假设我有以下数组:

$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但这里显示了一些示例:匿名函数。