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() .

6voto

Mahoor13 Punkte 4947

En Laravel Hilfsprogramm für die Verflachung von Arrays ist Arr::flatten()

5voto

Dariush Alipour Punkte 304

Ich glaube, dass dies die sauberste Lösung ist, ohne irgendwelche Mutationen oder unbekannte Klassen zu verwenden.

<?php

function flatten($array)
{
    return array_reduce($array, function($acc, $item){
        return array_merge($acc, is_array($item) ? flatten($item) : [$item]);
    }, []);
}

// usage
$array = [1, 2, [3, 4], [5, [6, 7]], 8, 9, 10];
print_r(flatten($array));

3voto

kenorb Punkte 134883

Probieren Sie die folgende einfache Funktion aus:

function _flatten_array($arr) {
  while ($arr) {
    list($key, $value) = each($arr); 
    is_array($value) ? $arr = $value : $out[$key] = $value;
    unset($arr[$key]);
  }
  return (array)$out;
}

Daraus folgt:

array (
  'und' => 
  array (
    'profiles' => 
    array (
      0 => 
      array (
        'commerce_customer_address' => 
        array (
          'und' => 
          array (
            0 => 
            array (
              'first_name' => 'First name',
              'last_name' => 'Last name',
              'thoroughfare' => 'Address 1',
              'premise' => 'Address 2',
              'locality' => 'Town/City',
              'administrative_area' => 'County',
              'postal_code' => 'Postcode',
            ),
          ),
        ),
      ),
    ),
  ),
)

erhalten Sie:

array (
  'first_name' => 'First name',
  'last_name' => 'Last name',
  'thoroughfare' => 'Address 1',
  'premise' => 'Address 2',
  'locality' => 'Town/City',
  'administrative_area' => 'County',
  'postal_code' => 'Postcode',
)

3voto

woru Punkte 1420

Sie können dies tun mit Ouzo-Leckereien :

 $result = Arrays::flatten($multidimensional);

Siehe: Hier

2voto

BurninLeo Punkte 3890

Wenn Sie eine Rekursion wirklich nicht mögen ... versuchen Sie stattdessen Shifting :)

$a = array(1,2,array(3,4, array(5,6,7), 8), 9);
$o = [];
for ($i=0; $i<count($a); $i++) {
    if (is_array($a[$i])) {
        array_splice($a, $i+1, 0, $a[$i]);
    } else {
        $o[] = $a[$i];
    }
}

N In dieser einfachen Version werden keine Array-Schlüssel unterstützt.

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