2017-01-26 19 views
1

У меня есть массив как это:Свести массив, сохраняя при этом ключевые пары значений в PHP

array (size=4) 
    0 => 
    array (size=4) 
     key => value 
     key => value 
     key => value 
     key => value 
    1 => 
    array (size=2) 
     key => value 
     key => value 
    2 => 
    array (size=1) 
     key => value 
    3 => 
    array (size=1) 
     key => value 

Я хочу, чтобы сгладить массив таким:

array (size=4) 
    key => value 
    key => value 
    key => value 
    key => value 
    key => value 
    key => value 
    key => value 
    key => value 

Я попробовал свои собственные решения, используя такие вещи, как array_merge, array_walk_recursive и RecursiveIteratorIterator с RecursiveArrayIterator. Я также попробовал много решений, размещенных по аналогичным вопросам в StackOverflow, но никто из них не работает так, как я ожидал. Они либо не сохраняют пары ключевых значений, либо дают мне массив, который идентичен оригиналу. Мои попытки выглядеть примерно так:

$multidimensionalArray = array(stuff goes here); 
$flatArray = array(); 

function flattenArray ($array) { 
    foreach ($array as $key => $value) { 
    if (is_array($value) { 
     flattenArray($value); 
    } 
    else { 
     $flatArray[$key] = $value; 
    } 
    } 
} 

flattenArray($multidimensionalArray); 
+0

Возможный дубликат [? Как Свести многомерный массив] (http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array) –

+0

Возможно, вы не сможете получить доступ к глобальной переменной '$ flatArray' внутри вашей функции. Объявите его глобальным внутри или передайте его по ссылке на функцию –

+0

Вы правы, я не получал доступ к переменной внутри функции. Когда я проверяю содержимое $ flatArray в цикле, я вижу, что он правильно сглаживает каждый дополнительный массив, но они не соединяются вместе. Я попытался использовать array_merge, чтобы исправить это, но после того, как петли закончены, я заканчиваю только конечной парой значений ключа. – user6679670

ответ

0

Интересно, что может пойти не так с RecursiveArrayIterator, потому что нужно было только собрать пары ключ/значение из итератора, используя простейший foreach цикл:

$a = [ 
    0 => ['a' => 1, 'b' => 2], 
    1 => ['x' => 3, 'y' => 4], 
    2 => 5, 
    3 => ['m' => 6, ['k' => 7, 'n' => 8]], 
]; 

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a)); 

foreach ($it as $key => $value) { 
    $result[$key] = $value; 
} 

print_r($result); 

Выход:

Array 
(
    [a] => 1 
    [b] => 2 
    [x] => 3 
    [y] => 4 
    [2] => 5 
    [m] => 6 
    [k] => 7 
    [n] => 8 
) 
+0

При печати результата он выглядит корректно, но когда я проверяю var_dump, клавиши фактически заменяются на 0-7, а значения сохраняются. – user6679670

+0

@ user6679670, 'var_dump' не имеет значения, если он не является ошибкой' var_dump', или 'var_dump' печатает объект, который неправильно реализует метод' __debuginfo'. Пример с 'var_dump': https://eval.in/725158 (как видите, ключи сохранены) –

+0

Я не думаю, что это проблема с var_dump, так как когда я пытаюсь ссылаться на ключи позже, мой код, их там нет (только индекс 0,1,2 и т. д.). Я закончил сглаживание ключей и значений отдельно, а затем с помощью comb_array, чтобы объединить их вместе с правильными парами ключ/значение. – user6679670

 Смежные вопросы

  • Нет связанных вопросов^_^