PHP:如何扁平化数组 - 最快的方法?

5

有没有一种快速的方法可以展平一个数组并选择子键(在这种情况下是 '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
        )

)

To:

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

3
我会尽力进行翻译,以下是需要翻译的内容: 重复:https://dev59.com/qnM_5IYBdhLWcg3wlEFH 我认为这个答案会对你最有帮助:https://dev59.com/qnM_5IYBdhLWcg3wlEFH/1320156#1320156 - Felix Kling
有什么理由要让它“最快”吗? - Your Common Sense
你为什么不想使用 foreach 呢? - salathe
4个回答

3

试一试这个:

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

1
哦,多么古老的运算符 :) - Your Common Sense
我建议在迭代数组之前始终使用reset($array)初始化数组迭代器,以避免其他调用(例如 end() )干扰它。有很多陷阱需要避免... - Gui Prá

3

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


array_walk本身无法工作,因为它除了返回一个布尔值之外什么也不返回(而且您无法修改数组的键)。 - ircmaxell

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;
}

-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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接