Как добавить ключ к каждому массиву в многомерном массиве, если он соответствует определенным критериям в php?

Допустим, у меня есть массив вроде:

$thing = Array
(
    [test1] => something
    [test2] => something
    [info] => yes
    [array] => Array
        (
            [test1] => something else
            [test2] => something else
            [info] => maybe
            [array] => Array
                (
                    [test1] => something
                    [info] => yes
                )

        )
)

Как я могу написать функцию, которая проходит через $thing и добавляет ключ к каждой части, называемой «действительной», со значением TRUE, если значение «информации» равно «да» и FALSE в противном случае?

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

$final = Array
(
    [test1] => something
    [test2] => something
    [info] => yes
    [valid] => TRUE //add this
    [array] => Array
        (
            [test1] => something else
            [test2] => something else
            [info] => maybe
            [valid] => FALSE //add this
            [array] => Array
                (
                    [test1] => something
                    [info] => yes
                    [valid] => TRUE //add this
                )

        )

)

Я пишу библиотеку для codeigniter, которая управляет картой сайта и предоставляет простые способы получения хлебных крошек и дерева навигации для страницы, но застрял в той части, где мне нужно сделать что-то подобное.

Главный вопрос, который я не могу понять: Как пройтись по массиву и добавить ключ к каждой части? Также в массивах может быть бесконечное количество массивов.

Спасибо!


person Tom Jenkinson    schedule 20.09.2012    source источник
comment
Не могли бы вы вместо этого просто использовать info, так как это дублирует данные. Если нет, то просто рекурсивная функция, которая берет массив, добавляет ключ valid и вызывает себя по ключу array, если он существует.   -  person Orbling    schedule 20.09.2012


Ответы (4)


Вы можете использовать это

$thing = Array
(
        "test1" => "something",
        "test2" => "something",
        "info" => "yes",
        "array" => Array
        (
                "test1" => "something else",
    "test2" => "something else",
    "info" => "maybe",
                "array" => Array
                (
                        "test1" => "something",
                        "info" => "yes"
                )
        )
);



function validPush($array)
{
    foreach ($array as $key => $value)
    {
        if(is_array($value))
           $array[$key] = validPush($value);

        if($key == "info")
            $array['valid'] = ($value == "yes") ? true : false ;
    }
    return $array;
}

var_dump(validPush($thing));

Выход

array
  'test1' => string 'something' (length=9)
  'test2' => string 'something' (length=9)
  'info' => string 'yes' (length=3)
  'array' => 
    array
      'test1' => string 'something else' (length=14)
      'test2' => string 'something else' (length=14)
      'info' => string 'maybe' (length=5)
      'array' => 
        array
          'test1' => string 'something' (length=9)
          'info' => string 'yes' (length=3)
          'valid' => boolean true
      'valid' => boolean false
  'valid' => boolean true
person Baba    schedule 20.09.2012
comment
Это именно то, что мне нужно. Спасибо :) - person Tom Jenkinson; 20.09.2012

Такое ощущение, что вы добавляете лишнюю информацию. Почему вы не можете просто повторно использовать данные в массиве, т.е.

[info] => yes
person Snowcrash    schedule 20.09.2012
comment
Я согласен, в этом примере я мог бы. В реальном коде, который я пишу, мне нужна функция, которая будет проходить по всему массиву и проверять некоторые вещи, а затем добавлять еще один ключ. - person Tom Jenkinson; 20.09.2012
comment
Проблема, с которой я сталкиваюсь, заключается в том, как добавить ключ? - person Tom Jenkinson; 20.09.2012
comment
@TomJenkinson: Важное правило для SO - если вы упрощаете вопрос, ожидайте упрощенных ответов. - person Orbling; 20.09.2012
comment
Я знаю. Я снова отредактировал его, и выделенный жирным шрифтом главный вопрос. - person Tom Jenkinson; 20.09.2012

почему бы просто не добавить значение в первый массив и не считать его действительным для остальных.

изменить: выполнить рекурсивный вызов, передав $array в зависимости от того, сколько у вас размерного массива, здесь 3.

function add_array( $array) {  
    $array['info'] = 'yes';
 return $arr;
}

вызов:

 $final = add_array(add_array(add_array($final)));
person Teena Thomas    schedule 20.09.2012
comment
Проблема в том, что это также не войдет в массивы, которые находятся в $arr. - person Tom Jenkinson; 20.09.2012

person    schedule
comment
ХОРОШО. Спасибо. Я забыл упомянуть, что это может быть бесконечное количество слоев... - person Tom Jenkinson; 20.09.2012
comment
изменено значение на действительное (опечатка) - person Dave; 20.09.2012
comment
@TomJenkinson: узнайте о рекурсивных функциях, как Дэйв показал выше (+1), и я упоминал ранее. - person Orbling; 20.09.2012
comment
если ваш пример array не назван так, вы можете выполнить foreach и посмотреть, является ли каждый элемент массивом, и если да, запустить на нем функцию. Это предполагает, что все глубокие слои на самом деле имеют элемент массива с именем array. - person Dave; 20.09.2012
comment
Я пытался написать рекурсивную функцию, но постоянно терялся, пытаясь сделать эту конкретную вещь. Возможно ли это с array_walk_recursive? - person Tom Jenkinson; 20.09.2012
comment
@TomJenkinson: Дэйв написал один выше ... array_walk_recursive() недостаточно избирательно, я думаю. - person Orbling; 20.09.2012
comment
добавлен foreach на случай, если вы не знаете имя потенциальных массивов в массиве, на котором вы также можете запустить это. Это будет искать во всех вложенных массивах элементы «info» и устанавливать «valid = true», если они существуют. Убедитесь, что это то, что вы хотите. - person Dave; 20.09.2012
comment
@Dave: Думаю, вас там ограбили, ваш код намного лучше, чем принятый ответ. Тоже лучший стиль. - person Orbling; 20.09.2012
comment
Извиняюсь. Я могу принять только один ответ, но я согласен, что они оба работают. - person Tom Jenkinson; 20.09.2012