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

时间:2014-12-31 03:07:57

标签: php arrays

比如说我有以下数组:

$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
        )

)

这就是我现在所处的位置,似乎无法弄清楚如何处理数组的其余部分,或任何大小的数组。

任何提示//评论都会受到赞赏。

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