Превратить многомерный массив PHP в двумерный массив - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь достичь чего-то, что, как я наивно полагал, было бы простым: сглаживание многомерного массива (который может иметь много вложенных уровней), но в результате все еще с массивами.В идеале я ищу функцию, которая может перебирать 10+ вложенных уровней и обрабатывать различный набор ключей (не обязательно всегда один и тот же).

Короче говоря, поворачивая это:

    Array
    (
        [0] => Array
            (
                [0] => Array
                    (
                        [index] => -1
                        [qty] => 77
                        [id] => 7
                    )

                [1] => Array
                    (
                        [index] => -1
                        [qty] => 83
                        [id] => 8
                    )
            )

        [1] => Array
            (
                [0] => Array
                    (
                        [index] => -1
                        [qty] => 75
                        [id] => 13
                    )

                [1] => Array
                    (
                        [index] => -1
                        [qty] => 60
                        [id] => 14
                        [msr] => g
                    )
            )

        [2] => Array
            (
                [index] => -1
                [qty] => 10
                [id] => 12
            )
    )

В это:

    Array
    (
        [0] => Array
            (
                [index] => -1
                [qty] => 77
                [id] => 7
            )

        [1] => Array
            (
                [index] => -1
                [qty] => 83
                [id] => 8
            )

        [2] => Array
            (
                [index] => -1
                [qty] => 75
                [id] => 13
            )

        [3] => Array
            (
                [index] => -1
                [qty] => 60
                [id] => 14
                [msr] => g
            )

        [4] => Array
            (
                [index] => -1
                [qty] => 10
                [id] => 12
            )
    )

Это то, что у меня было, и я думал, что это сработает, но я получаю плоский массив без информации о ключе (и если мне нужны ключи, каждая итерация перезаписывает предыдущие значения иЯ получаю только последний массив из них):

function flatten_multi_array(array $array){
    $ret_array = array();
    foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $value) {
        $ret_array[] = $value;
    }
    return $ret_array;
}

Ответы [ 4 ]

1 голос
/ 03 октября 2011

Если вы все еще ищете подход RecursiveIteratorIterator, см. Следующее:

foreach(new RecursiveIteratorIterator(new ParentIterator(new RecursiveArrayIterator($array)), RecursiveIteratorIterator::SELF_FIRST) as $value) {
    if (isset($value['index']))
        $ret_array[] = $value;
}

Это должно делать это внутри вашей функции.См. Также demo .

Related: Быстрый рекурсивный поиск всех индексов в массиве

1 голос
/ 03 октября 2011
function dig($source, &$out){
    foreach ($source as $k => $v){
        if (isset($v["index"]){
             $out[] = $v;
        } else {
             dig($v, $out);
        }
    }
}

и все.

использование:

$out = array();
$source = array(); // your magic nested array

dig($source, $out);

и теперь $out имеет то, что вам нужно.

0 голосов
/ 03 октября 2011

Я вижу, что на это только что ответили. Ну, я думал, что внесу свое решение, так как я сделал это. : P

$newArray = array();
function isMulti($k,$v){
    global $newArray;
    if(is_array($v)){
    foreach($v as $k2 => $v2){
        if(!is_array($v2)){
            $newArray[] = $v;
            break;
        }else{
            isMulti($k2,$v2);
        }
    }
    }
}
foreach($arrayInQuestion as $k => $v){
    isMulti($k,$v);
}
0 голосов
/ 03 октября 2011

Что-то вроде этого непроверенного кода, может быть ...

$outArray = array();
foreach($originalArray as $nestedArray){
    foreach($nestedArray as $innerArray){
        $outArray[] = $innerArray;
    }
}
print_r($outArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...