从多维数组中获取所有值

时间:2016-06-29 02:42:30

标签: php arrays

让我们说,我有一个这样的数组:

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

然后,我想获取所有值(颜色,'blue''gray''orange''white')并将它们连接到一个数组中。如果不使用foreach两次,我该怎么做?

提前致谢。

7 个答案:

答案 0 :(得分:1)

试试这个:

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

get_values($array);

答案 1 :(得分:1)

  

如果不使用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);

这是live demo

答案 2 :(得分:1)

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

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

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,
// )

答案 3 :(得分:0)

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

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

我希望这会有所帮助。

答案 4 :(得分:0)

这是一个递归函数,它既可以获取这些端点值的数组,也可以获得一个包含所有键的数组,但只是展平。

代码:

<?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
)

答案 5 :(得分:0)

TL; DR

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

信用:How to "flatten" a multi-dimensional array to simple one in 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']

答案 6 :(得分:0)

这是什么?它可以与 ANY 数组深度一起使用。

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

P.S。解决方案不是我的,而是完美的,我希望它能对某人有所帮助。 原始来源:

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