337 Stimmen

Wie kann man ein mehrdimensionales Array reduzieren?

Ist es möglich, in PHP ein (bi-/multi) dimensionales Array ohne Rekursion oder Referenzen zu reduzieren?

Ich interessiere mich nur für die Werte, so dass die Schlüssel ignoriert werden können, ich denke in den Linien der array_map() y array_values() .

2voto

Andriy Punkte 907

Wie wäre es, einen rekursiven Generator zu verwenden? https://ideone.com/d0TXCg

<?php

$array = [
    'name' => 'Allen Linatoc',
    'profile' => [
        'age' => 21,
        'favourite_games' => [ 'Call of Duty', 'Titanfall', 'Far Cry' ]
    ]
];

foreach (iterate($array) as $item) {
    var_dump($item);
};

function iterate($array)
{
    foreach ($array as $item) {
        if (is_array($item)) {
            yield from iterate($item);
        } else {
            yield $item;
        }
    }
}

2voto

Jsowa Punkte 6338

Wenn Sie auch Ihre Schlüssel behalten wollen, ist das die Lösung.

function flatten(array $array) {
    $return = array();
    array_walk_recursive($array, function($value, $key) use (&$return) { $return[$key] = $value; });
    return $return;
}

Leider werden nur endgültige verschachtelte Arrays ausgegeben, ohne mittlere Schlüssel. Also für das folgende Beispiel:

$array = array(
    'sweet' => array(
        'a' => 'apple',
        'b' => 'banana'),
    'sour' => 'lemon'); 
print_r(flatten($fruits));

Die Ausgabe ist:

Array
(
    [a] => apple
    [b] => banana
    [sour] => lemon
)

2voto

Rick Garcia Punkte 167

Der Trick besteht darin, sowohl das Quell- als auch das Ziel-Array per Referenz zu übergeben.

function flatten_array(&$arr, &$dst) {
    if(!isset($dst) || !is_array($dst)) {
        $dst = array();
    }
    if(!is_array($arr)) {
        $dst[] = $arr;
    } else {
        foreach($arr as &$subject) {
            flatten_array($subject, $dst);
        }
    }
}

$recursive = array('1', array('2','3',array('4',array('5','6')),'7',array(array(array('8'),'9'),'10')));
echo "Recursive: \r\n";
print_r($recursive);
$flat = null;
flatten_array($recursive, $flat);

echo "Flat: \r\n";
print_r($flat);

// If you change line 3 to $dst[] = &$arr; , you won't waste memory,
// since all you're doing is copying references, and imploding the array 
// into a string will be both memory efficient and fast:)

echo "String:\r\n";
echo implode(',',$flat);

1voto

Rakesh Jakhar Punkte 6298

Dies kann erreicht werden durch die Verwendung von array_walk_recursive

$a = array(1,2,array(3,4, array(5,6,7), 8), 9);
array_walk_recursive($a, function($v) use (&$r){$r[]=$v;});
print_r($r);

Arbeitsbeispiel :- https://3v4l.org/FpIrG

1voto

Robert Yeomans Punkte 31

Ab PHP v7.4 können Sie den Spread-Operator verwenden und die Arrays zusammenführen. Einfach und effektiv.

$flatArr = array_merge(...$originalArray);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X