PHP:flatten array - 最快的方法?

时间:2010-05-28 16:43:13

标签: php arrays

有没有快速的方法来展平数组并选择子键(在这种情况下为'key'&'value')而不运行foreach循环,或者foreach总是最快的方式?

Array
(
    [0] => Array
        (
            [key] => string
            [value] => a simple string
            [cas] => 0
        )

    [1] => Array
        (
            [key] => int
            [value] => 99
            [cas] => 0
        )

    [2] => Array
        (
            [key] => array
            [value] => Array
                (
                    [0] => 11
                    [1] => 12
                )

            [cas] => 0
        )

)

要:

Array
(
    [int] => 99
    [string] => a simple string
    [array] => Array
        (
            [0] => 11
            [1] => 12
        )
)

4 个答案:

答案 0 :(得分:3)

试一试:

$ret = array();
while ($el = each($array)) {
    $ret[$el['value']['key']] = $el['value']['value'];
}

答案 1 :(得分:3)

call_user_func_array("array_merge", $subarrays)可用于“展平”嵌套数组 你想要的是完全不同的东西。您可以使用带有回调的array_walk()来将数据提取为所需的格式。但不,foreach循环仍然更快。否则,没有array_*方法来实现您的结构。

答案 2 :(得分:0)

希望它会对其他人有所帮助,但这是我用来平整数组并使嵌套元素更易于访问的功能。

此处的用法和说明: https://totaldev.com/flatten-multidimensional-arrays-php/

功能:

// Flatten an array of data with full-path string keys
function flat($array, $separator = '|', $prefix = '', $flattenNumericKeys = false) {
    $result = [];

    foreach($array as $key => $value) {
        $new_key = $prefix . (empty($prefix) ? '' : $separator) . $key;

        // Make sure value isn't empty
        if(is_array($value)) {
            if(empty($value)) $value = null;
            else if(count($value) == 1 && isset($value[0]) && is_string($value[0]) && empty(trim($value[0]))) $value = null;
        }

        $hasStringKeys = is_array($value) && count(array_filter(array_keys($value), 'is_string')) > 0;
        if(is_array($value) && ($hasStringKeys || $flattenNumericKeys)) $result = array_merge($result, flat($value, $separator, $new_key, $flattenNumericKeys));
        else $result[$new_key] = $value;
    }

    return $result;
}

答案 3 :(得分:-1)

这应该正确地将数组与整数键组合在一起。如果密钥是连续的并且从零开始,则它们将被丢弃。如果扁平数组中尚未存在整数键,则它将保持原样;这应该主要保留不连续的数组。

function array_flatten(/* ... */)
{
    $flat = array();
    array_walk_recursive(func_get_args(), function($value, $key)
    {
        if (array_key_exists($key, $flat))
        {
            if (is_int($key))
            {
                $flat[] = $value;
            }
        }
        else
        {
            $flat[$key] = $value;
        }
    });
    return $flat;
}

您可以使用!isset($key)empty($key)来支持有用的值。

这是一个更简洁的版本:

function array_flatten(/* ... */)
{
    $flat = array();
    array_walk_recursive(func_get_args(), function($value, $key) use (&$flat)
    {
        $flat = array_merge($flat, array($key => $value));
    });
    return $flat;
}