2016-06-15 4 views
0

У меня есть массив $report:Заменить значение массива с другим значением на основе ключей из другого массива значений

Array 
(
    [03.05.2016] => Array 
     (
      [tasks] => Array 
       (
        [group1] => to change 
       ) 

      [start] => 8:00 
      [end] => 16:00 
     ) 

) 

и второй массив $keys:

Array 
(
    [0] => 03.05.2016 
    [1] => tasks 
    [2] => group1 
) 

и переменную $value со значением CHANGED

Я ищу способ изменить значение

$report[03.05.2016][tasks][group1] 

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

(
    [03.05.2016] => Array 
     (
      [tasks] => Array 
       (
        [group1] => CHANGED 
       ) 

      [start] => 8:00 
      [end] => 16:00 
     ) 

) 

Может кто-нибудь мне помочь?

+0

Как вы знаете, что это тот, который вы хотите проверить? –

+0

Можете ли вы написать больше? я не выдерживаю ваш вопрос, действительно хочу? –

ответ

1

Вы можете работать вниз через $report переменную, назначая по ссылке на каждый «шаг» в вашем $keys массиве, а затем изменить последний уровень в ваше новое значение.

Редактировать: Преимущество этого подхода в том, что он будет работать для любого количества уровней, хотя, если у вас всегда будет только три шага, тогда ответ от @zakhefron станет более ясным.

<?php 
$report = [ 
    '03.05.2016' => [ 
     'tasks' => [ 
      'group1' => 'to change' 
     ], 

     'start' => 8:00 
     'end' => 16:00 
    ] 
]; 

$keys = ['03.05.2016', 'tasks', 'group1']; 

$value = 'CHANGED'; 

// Start at the top level of $report 
$target =& $report; 

// Then work down through the keys 
while ($key = array_shift($keys)) 
{ 
    $target =& $target[$key]; 
} 

// Finally, set the final target to the new value 
$target = $value; 

print_r($report); 

=

Array 
(
    [03.05.2016] => Array 
     (
      [tasks] => Array 
       (
        [group1] => CHANGED 
       ) 

      [start] => 8:00 
      [end] => 16:00 
     ) 

) 
+0

не работает, см. Https://eval.in/589540 –

+0

Простите, пропустил &. Исправлено, когда я тестировал его и не вставлял обратно в ответ. https://eval.in/589556 – iainn

1

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

Наконец ключи остались пустыми, поскольку все они искали, теперь вы можете просто обновить значение и вернуть true, иначе верните false, если не найдете.

$report = array(
    '03.05.2016' => array(
     'tasks' => Array(
      'group1' => 'to change' 
     ), 
     'start' => '8:00', 
     'end' => '16:00' 
)); 

$keys = array(
    '03.05.2016', 
    'tasks', 
    'group1' 
); 

$value = 'CHANGED'; 

function updateValue(&$source, $keys, $value) { 
    $keysCount = count($keys); 
    if(empty($keys)) { 
     $source = $value; 
     return true; 
    } 
    foreach($keys as $key) { 
     if(isset($source[$key])) { 
      array_shift($keys); 
      return updateValue($source[$key], $keys, $value); 
     } 
     else return false; 
    } 
} 

updateValue($report, $keys, $value); 
print_r($report); 

Смотреть это работает: https://eval.in/589461