簡體   English   中英

PHP的:扁平數組-最快的方法?

[英]PHP : flatten array - fastest way?

是否有任何快速的方法可以在不運行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
        )

)

至:

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

試一下:

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

call_user_func_array("array_merge", $subarrays)可用於“展平”嵌套數組。
您想要的是完全不同的東西。 您可以將array_walk()與回調一起使用,以將數據提取為所需的格式。 但是不,foreach循環仍然更快。 否則,沒有array_*方法可以實現您的結構。

希望它會對其他人有所幫助,但這是我用來展寬數組並使嵌套元素更易於訪問的函數。

此處的用法和說明: https : //totaldev.com/flatten-multiDimension-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;
}

這應該將數組與整數鍵正確組合。 如果鍵是連續的並且從零開始,則將其刪除。 如果在平面數組中尚不存在整數鍵,它將保持原樣;否則,它將保持不變。 這應該主要保留不連續的數組。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM