繁体   English   中英

从多维数组中获取所有值

[英]Get all values from multidimensional array

比方说,我有一个这样的数组:

$array = [
    'car' => [
        'BMW' => 'blue',
        'toyota' => 'gray'
        ],
    'animal' => [
        'cat' => 'orange',
        'horse' => 'white'
        ]
    ];

然后,我想获取所有值(颜色、 'blue''gray''orange''white' )并将它们连接到一个数组中。 如何在不使用foreach两次的情况下做到这一点?

提前致谢。

TL; 博士

$result = call_user_func_array('array_merge', $array);

信用: 如何在 PHP 中将多维数组“展平”为简单数组?

在您的用例中,您应该像这样使用它:

<?php
$array = [
    'car' => [
        'BMW' => 'blue',
        'toyota' => 'gray'
        ],
    'animal' => [
        'cat' => 'orange',
        'horse' => 'white'
        ]
    ];
$result = call_user_func_array('array_merge', $array);
$result = array_values($result);

//$result = ['blue', 'gray', 'orange', 'white']

试试这个:

function get_values($array){
    foreach($array as $key => $value){
        if(is_array($array[$key])){
            print_r (array_values($array[$key]));
        }
    }
}

get_values($array);

如何在不使用 foreach 两次的情况下做到这一点?

首先使用RecursiveIteratorIterator类将多维数组展平,然后应用array_values()函数在单个数组中获取所需的颜色值。

以下是参考资料:

所以你的代码应该是这样的:

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
$flatten_array = array_values(iterator_to_array($iterator,true));

// display $flatten_array
echo "<pre>"; print_r($flatten_array);

这是现场演示

这是一个递归函数,它使您既可以获取这些端点值的数组,也可以获取所有键完好无损但只是扁平化的数组。

代码:

<?php

$array = [
    'car' => [
        'BMW' => 'blue',
        'toyota' => 'gray'
        ],
    'animal' => [
        'cat' => 'orange',
        'horse' => 'white'
        ]
    ];

//
print "\n<br> Array (Original): ".print_r($array,true);
print "\n<br> Array (Flattened, With Keys): ".print_r(FlattenMultiArray($array,true),true);
print "\n<br> Array (Flattened, No Keys): ".print_r(FlattenMultiArray($array,false),true);

//
function FlattenMultiArray($array,$bKeepKeys=true,$key_prefix='')
{
    //
    $array_flattened=Array();

    //
    foreach($array as $key=>$value){

        //
        if(Is_Array($value)){
            $array_flattened=Array_Merge(
                $array_flattened,
                FlattenMultiArray($value,$bKeepKeys,$key)
            );
        }
        else{
            if($bKeepKeys){
                $array_flattened["{$key_prefix}_{$key}"]=$value;
            }
            else{
                $array_flattened[]=$value;
            }
        }
    }

    return $array_flattened;
}

?>

输出:

<br> Array (Original): Array
(
    [car] => Array
        (
            [BMW] => blue
            [toyota] => gray
        )

    [animal] => Array
        (
            [cat] => orange
            [horse] => white
        )

)

<br> Array (Flattened, With Keys): Array
(
    [car_BMW] => blue
    [car_toyota] => gray
    [animal_cat] => orange
    [animal_horse] => white
)

<br> Array (Flattened, No Keys): Array
(
    [0] => blue
    [1] => gray
    [2] => orange
    [3] => white
)

旧的,但据我所知,并没有真正发布“处理所有情况”的功能。

所以这里是常见的经典递归函数:

function getArrayValuesRecursively(array $array)
{
    $values = [];
    foreach ($array as $value) {
        if (is_array($value)) {
            $values = array_merge($values,
                getArrayValuesRecursively($value));
        } else {
            $values[] = $value;
        }
    }
    return $values;
}

示例数组:

$array = [
    'car'    => [
        'BMW'    => 'blue',
        'toyota' => 'gray'
    ],
    'animal' => [
        'cat'   => 'orange',
        'horse' => 'white'
    ],
    'foo'    => [
        'bar',
        'baz' => [
            1,
            2 => [
                2.1,
                'deep' => [
                    'red'
                ],
                2.2,
            ],
            3,
        ]
    ],
];

致电:

echo var_export(getArrayValuesRecursively($array), true) . PHP_EOL;

结果:

// array(
//     0 => 'blue',
//     1 => 'gray',
//     2 => 'orange',
//     3 => 'white',
//     4 => 'bar',
//     5 => 1,
//     6 => 2.1,
//     7 => 'red',
//     8 => 2.2,
//     9 => 3,
// )

如果您不关心索引,那么应该这样做:

$colors = array();
foreach ($array as $item) {
  $colors = array_merge($colors, array_values($item));
}

如果要保留索引,可以使用:

$colors = array();
foreach ($array as $item) {
  // this leaves you open to elements overwriting each other depending on their keys
  $colors = array_merge($colors, $item);
}

我希望这会有所帮助。

这个怎么样?它适用于任何数组深度。

private function flattenMultiArray($array)
{
    $result = [];
    self::flattenKeyRecursively($array, $result, '');

    return $result;
}

private static function flattenKeyRecursively($array, &$result, $parentKey)
{
    foreach ($array as $key => $value) {
        $itemKey = ($parentKey ? $parentKey . '.' : '') . $key;
        if (is_array($value)) {
            self::flattenKeyRecursively($value, $result, $itemKey);
        } else {
            $result[$itemKey] = $value;
        }
    }
}

PS 解决方案不是我的,但效果很好,我希望它会对某人有所帮助。 原始来源:

https://github.com/letsdrink/ouzo/blob/master/src/Ouzo/Goodies/Utilities/Arrays.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM