2017-02-08 5 views
0

У меня есть многомерный массив, который может содержать или не содержать ключ name один или несколько раз. То, что я хотел бы сделать, это для каждого экземпляра упомянутого элемента вставить другой элемент рядом с этим элементом с ключом key.Рекурсивно вставить элемент рядом с другим элементом в массиве

Таким образом, учитывая этот массив:

[ 
    [ 
     'noname' => 'No name', 
     'label' => 'I have no name' 
    ], 
    [ 
     'name' => 'foo', 
     'label' => 'Foo', 
     'fields' => [ 
      [ 
       'name' => 'bar', 
       'label' => 'Bar' 
      ] 
     ] 
    ], 
    [ 
     'name' => 'baz', 
     'label' => 'Baz' 
    ] 
] 

я хотел бы следующий вывод:

[ 
    [ 
     'noname' => 'No name', 
     'label' => 'I have no name' 
    ], 
    [ 
     'name' => 'foo', 
     'key' => 'foo-key', # This is inserted by the function 
     'label' => 'Foo', 
     'fields' => [ 
      [ 
       'name' => 'bar', 
       'key' => 'bar-key', # This is inserted by the function 
       'label' => 'Bar' 
      ] 
     ] 
    ], 
    [ 
     'name' => 'baz', 
     'key' => 'baz-key', # This is inserted by the function 
     'label' => 'Baz' 
    ] 
] 

Я смотрел в array_walk_recursive, но не может заставить его работать. Нужно ли мне писать собственную рекурсивную функцию или есть что-то подходящее, что я могу использовать для этого?

+0

Доля код, который вы написали, используя array_walk_recursive и что не работает. – alzee

+0

Tbh Я сразу же упал, потому что я не мог получить доступ к исходному массиву из моего обратного вызова 'array_walk_recursive' ... Я почти уверен, что могу написать пользовательскую функцию для этого, но все еще надеялся на некоторые предложения по построению в функциях или других идеях, которые я, возможно, забыл. – powerbuoy

+1

array_walk_recursive дает вам элементы, которые не являются массивами, если он встречает какой-либо элемент массива, он продолжает рыть. Вероятно, поэтому это не сработало для вас. В любом случае, если вы используете ключевое слово 'use' для отправки вашего массива в область закрытия, вы можете получить к нему доступ (по-прежнему не поможет вам в этом случае). –

ответ

2

Ваш код будет выглядеть примерно так:

<?php 
$array = [ 
    [ 
     'noname' => 'No name', 
     'label' => 'I have no name' 
    ], 
    [ 
     'name' => 'foo', 
     'label' => 'Foo', 
     'fields' => [ 
      [ 
       'name' => 'bar', 
       'label' => 'Bar' 
      ] 
     ] 
    ], 
    [ 
     'name' => 'baz', 
     'label' => 'Baz' 
    ] 
]; 

function fix_array($array){ 
    foreach ($array as $key => $value){ 
     if (is_array($value)){ 
      $array[$key] = fix_array($value); 
     } 
     elseif ($key == 'name'){ 
      $array['key'] = $value . '-key'; 
     } 
    } 
    return $array; 
} 

$new_array = fix_array($array); 

print_r($new_array); 
+0

Спасибо за это, я думаю, это не намного проще! – powerbuoy

+0

Добро пожаловать! Я рад, что это помогло. – jetblack

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