2015-02-25 3 views
-2

У меня есть многомерная карта (коллекция) $ data в PHP hack. Я хочу, чтобы искать ключ «дорогу» и заменить его значение сЭлементы коллекции не могут быть сделаны по ссылке в php

map{ 'test' => abc}; 

У меня есть основные массивы

$keys = ['meta', 'attr', 'road']; 

ниже мой Карта

 $data = Map {'meta' => Map { 
      'time' => 11.364, 
      'count' => 3, 
       'attr' => Map { 
        'id'=> 7845, 
        'road' => Map { 
         'length' => 'km', 
         'width' => 'm' 
           } 
         } 
        }, 
      'Assets' => [15,78,89] 

     }; 

Я пытался ниже коды но дайте мне ошибку:

$keys = ['meta','attr']; 
       $arr = &$data; 
       foreach($keys as $key) 
       { 
        $arr = &$arr[$key]; 
       } 

       $arr = map{ 'test' => abc}; 

Любые мысли, как я могу реализовать алгоритм поиска и замены?

+1

В чем ошибка, с которой вы столкнулись? Включение фактического текста ошибки всегда полезно. Элементы коллекции не могут быть взяты по ссылке, которая по дизайну. Ссылки и на массивы имеют супер удивительную семантику в PHP, поэтому библиотеки коллекций просто не позволяют этого. Одна из этих удивительных семантик: попробуйте свой код с массивами. Я уверен, что он уничтожит '$ data', так как каждый раз, когда вы перебираете цикл, вы будете перезаписывать внешние' $ data' одним из своих составных элементов. –

ответ

0

Не проверено, но я думаю, что это сработает.

function treeSubstitution($multi: Map<string, mixed>): Map<string, mixed> { 
    $multi->mapWithKey(($k, $v) ==> $k === 'road' ? map { 'test' => 'abc' } : treeSubstitution($v)); 
} 

Этот вид многомерной карты является фактически деревом. И вам нужно использовать алгоритмы обхода дерева: http://en.wikipedia.org/wiki/Tree_traversal

+0

Спасибо @Pablo даст вам попробовать – Vish021