Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:展平数组-最快的方法?_Php_Arrays - Fatal编程技术网

PHP:展平数组-最快的方法?

PHP:展平数组-最快的方法?,php,arrays,Php,Arrays,是否有任何快速的方法可以在不运行foreach循环的情况下展平数组并选择子键(“在本例中为key”和“value”),或者foreach始终是最快的方法 Array ( [0] => Array ( [key] => string [value] => a simple string [cas] => 0 ) [1] => Array

是否有任何快速的方法可以在不运行foreach循环的情况下展平数组并选择子键(“在本例中为key”和“value”),或者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
        )

)
致:

试一试:

$ret = array();
while ($el = each($array)) {
    $ret[$el['value']['key']] = $el['value']['value'];
}
call\u user\u func\u array(“array\u merge”,$subarray)
可用于“展平”嵌套数组。

你想要的是完全不同的东西。您可以使用带有回调的
array\u walk()
将数据提取到所需的格式。但是不,foreach循环仍然更快。没有
array.*
方法来实现您的结构。

这应该正确地将数组与整数键组合起来。如果键是连续的,并且从零开始,它们将被丢弃。如果整型键在平面数组中还不存在,它将保持原样;这应该主要保留非连续数组

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

希望它能帮助其他人,但这里有一个函数,我用来展平数组并使嵌套元素更容易访问

此处的用法和说明:

职能:

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

重复:我认为这个答案对你的帮助最大:有什么理由让它“最快”?有什么理由你不想使用
foreach
?哦,多么古老的运算符:)我建议总是在迭代之前使用
reset($array)
初始化数组迭代器,以避免再次调用,例如
end()
会把它弄糟的。很多方法都会落入这个陷阱……array\u walk本身不起作用,因为它只返回bool(并且不能修改数组的键)。
// 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;
}