Я пытаюсь добавить новую пару клавиш в конце каждого элемента {{x0}}:

<?php
$json = '[
  {
    "date": "2014-10-09T17:38:19Z",
    "users": [
      {
        "name": "Peter",
        "age": 20
      },
      {
        "name": "Anne",
        "age": 25
      },
      {
        "name": "William",
        "age": 30
      }
    ]
  }
]';

addData ( $json );
function addData($json) {
    $obj = json_decode ( $json, true );
    foreach ( $obj as $items ) {
        foreach ( $items ['users'] as $users ) {
            $array = array (
                    "myKey" => "myValue" 
            );
            array_push ( $users, $array );
        }
    }
    $json = json_encode ( $obj );

    echo $json;
}
?>

Итак, новый json должен выглядеть так

[  
   {  
      "date":"2014-10-09T17:38:19Z",
      "users":[  
         {  
            "name":"Peter",
            "age":20,
            "myKey":"myValue"
         },
         {  
            "name":"Anne",
            "age":25,
            "myKey":"myValue"
         },
         {  
            "name":"William",
            "age":30,
            "myKey":"myValue"
         }
      ]
   }
]

Вместо этого я получаю свой старый {{x0}} в качестве вывода, без новой пары ключа.

1
user1170330 26 Дек 2015 в 13:10

3 ответа

Лучший ответ

Взято из руководства по foreach:

Чтобы иметь возможность напрямую изменять элементы массива внутри цикла, перед значением $ value стоит &. В этом случае значение будет присвоено по ссылке.

Таким образом, вы можете редактировать значения в массиве {{x0}} и {{x1}}.

Думаю, можно так:

addData ( $json );
function addData($json) {
    $obj = json_decode ( $json, true );
    foreach ( $obj as &$items ) {
        foreach ( $items ['users'] as &$users ) {
            $users["mykey"] = "myValue";
        }
    }
    $json = json_encode ( $obj );
    echo $json;
}

Результатом будет:

[{
    "date": "2014-10-09T17:38:19Z",
    "users": [{
        "name": "Peter",
        "age": 20,
        "mykey": "myValue"
    }, {
        "name": "Anne",
        "age": 25,
        "mykey": "myValue"
    }, {
        "name": "William",
        "age": 30,
        "mykey": "myValue"
    }]
}]
3
The fourth bird 26 Дек 2015 в 10:38

Основная проблема заключается в том, что foreach предоставляет копию массивов, а не фактический массив, поэтому, когда вы изменяете $ users, вы не изменяете переменную $ json, как вы думаете. Попробуйте следующее: я изменил имена переменных и т. Д. Для удобства чтения

<?php
$json = '[
  {
    "date": "2014-10-09T17:38:19Z",
    "users": [
      {
        "name": "Peter",
        "age": 20
      },
      {
        "name": "Anne",
        "age": 25
      },
      {
        "name": "William",
        "age": 30
      }
    ]
  }
]';

$updated = addData ( $json );
echo $updated;

function addData($json) {
    $ArrList = json_decode ( $json, true );

    foreach ( $ArrList['users'] as $userKey => $user ) {
            $array = array (
                    "myKey" => "myValue" 
             );
        $ArrList['users'][$userKey][] =  $array;
    }

    $json = json_encode ( $ArrList );

    return $json;
}
?>

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

0
Toby Allen 26 Дек 2015 в 10:33

Вы должны пропустить {{x0}} и {{x1}}, по ссылке, например:


function addData($json) {

    $obj = json_decode ( $json, true );

    foreach ( $obj as &$items ) {
        foreach ( $items ['users'] as &$users ) {
            $users['myKey'] = 'myValue';
        }
    }
    $json = json_encode ( $obj );

    echo $json;
}
0
Davide Caruso 26 Дек 2015 в 10:39