2014-02-03 3 views
0

В настоящее время я эта array структуры, которую я позже конвертировать в JSON:Append массива к конкретному элементу массива

Array 
(
    [response] => Array 
     (
      [timestamp] => 1391457939 
      [crimes] => Array 
       (
        [year] => 6-2013 
       ) 
     ) 
) 

Я хочу знать, если есть способ, чтобы добавить данные массива в выбранном узел массива без указав узел корневого массива. Например, я хочу добавить следующее array к crimes массив сверху:

array(
    "Robbery" => 123, 
    "Burglary" => 456 
); 

Так оно и должно выглядеть следующим образом:

Array 
(
    [response] => Array 
     (
      [timestamp] => 1391457939 
      [crimes] => Array 
       (
        [year] => 6-2013 
        [Robbery] => 123 //Appended Data 
        [Burglary] => 456 //Appended Data 
       ) 
     ) 
) 

Функция:

public function addDataToJSONResp($parentArrayName, $arrayData){ 

     //jsonResponse is the main array which currently holds the array data which will be converted into JSON at a later step. 
     if(isset($this->jsonResponse)){ 
      //Do processing here 
      //Search for parent array node in jsonResponse. 
      //append $arrayData to jsonResponse if it finds the parent array element. 
     }else{ 
      //error 
     } 
    } 

используется функция :

private function addDataToJSONResp($nodeName, &$array, $data) { 
     foreach ($array as $key => $val) { 

      if ($key == $nodeName) { 

       foreach($data as $k => &$v){ 
        $array[$key][$k] = $v; 
       } 

      }else if(is_array($val)){ 
       $this->addDataToJSONResp($nodeName, $val, $data); 
      } 
     } 
    } 
+1

Вы должны указать структуру _somehow_. Каковы бизнес-правила, чтобы решить, где добавить данные? – jterry

+0

У меня будет функция, которая позволит пользователю указать родительское имя массива, к которому они хотят добавить данные. – user3166216

+0

@ user3166216 Покажите нам подпись этой функции, которую вы сейчас упоминаете ... – crush

ответ

0

Это то, чего вы хотели достичь?

<?php 


/** 
* We're passing the $inputArray in as reference 
* since we want the passed array to be changed 
* right away 
* 
* $dataArray is the array we want to append 
* 
* $node, is the array key of the array we want our data 
* to append on 
**/ 

function pushToNode(&$inputArray, $dataArray, $node) 
{ 
    // Traverse our Input array 
    foreach($inputArray AS $key => &$value) 
    { 
     // If the key of the current iteration 
     // matches the node we want to append 
     // our data on, we're done. 
     if($key === $node){ 
      // We just iterate trough our data array... 
      foreach($dataArray AS $k => &$v) 
      { 
       // and append the keys and the values 
       // to the array we wanted to. 
       $inputArray[$key][$k] = $v; 
      } 
      return; 
     } 
     // Since you don't want to specify the root node 
     // our function needs to be recursive 
     if(is_array($value)) 
     { 
      pushToNode($value, $dataArray, $node); 
     } 
    } 
} 

$myArray = [ 

    'response' => [ 
     'timestamp' => 1293845329, 
     'crimes' => [ 
      'year' => '1995' 
     ] 
    ] 

]; 

$crimes = [ 
    'robbery' => 'I robbed someone, wow!', 
    'burglary' => 'Oh look. Catch me if you can.' 
]; 

pushToNode($myArray, $crimes, 'crimes'); 

echo "<pre>"; 
print_r($myArray); 
echo "</pre>"; 

Выход:

Array 
(
    [response] => Array 
     (
      [timestamp] => 1293845329 
      [crimes] => Array 
       (
        [year] => 1995 
        [robbery] => I robbed someone, wow! 
        [burglary] => Oh look. Catch me if you can. 
       ) 

     ) 

) 

Важный код прокомментирован, но в основном мы обход массива ввода рекурсивны. Если мы находимся на узле, мы хотим добавить наши данные, добавим его и вернем. Наш входной массив передается в качестве ссылки, поэтому сам массив будет изменен.

+0

Я попытался избежать внутреннего foreach с помощью array_walk, но кое-что испортил со ссылками здесь. Я был бы признателен, если бы кто-нибудь мог подмигнуть мне, как это сделать «чище». – thpl

+0

'$ inputArray [$ key] [$ k] = $ v;' не добавляет значение к массиву. – user3166216

+0

Как вы использовали эту функцию? Я полностью протестировал его, и он работал безупречно. Я добавлю вывод. – thpl

0

Вы можете сохранить ссылку на подрешетки в переменной:

$root = array(
    'response' => array(
     'timestamp' => 1391457939, 
     'crimes' => array(
      'year' => '6-2013' 
     ) 
    ) 
); 

$crimes = &$root['response']['crimes']; 

Теперь, когда вы вносите изменения в $crimes, это будет отражено в $root.

Для того, чтобы добавить массив:

array(
    "Robbery" => 123, 
    "Burglary" => 456 
); 

Вы могли бы сделать:

$crimes = array_merge($crimes, array(
    "Robbery" => 123, 
    "Burglary" => 456 
)); 

В качестве альтернативы:

$crimes['Robbery'] = 123; 
$crimes['Burglary'] = 456; 

Выходы

Array 
(
    [response] => Array 
     (
      [timestamp] => 1391457939 
      [crimes] => Array 
       (
        [year] => 6-2013 
        [Robbery] => 123 
        [Burglary] => 456 
       ) 

     ) 

) 

Вот demonstration, размещенный на ideone.com.

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