Добавить ключ/значение для каждого элемента массива - PHP

Я пытаюсь сделать простую вещь, добавив дополнительный ключ/значение для каждого элемента в моем массиве. У меня возникают трудности с этим, потому что дополнительный ключ/значение добавляется внизу, а не внутри каждого массива (ключа).

Это мой массив:

[
[{
    "id": 11,
    "product_id": 3,
    "sku": 30000011,
    "name": "BCAA 2:1:1 400g Fruit Punch",
    "slug": "bcaa-211-400g-fruit-punch",
    "files_id": 1397,
    "image_name": "bcaa-211-400g-proteinfabrikken-1.jpg",
    "image_uuid": "494bacb0-13ae-11e7-b439-adf9395810da",
    "image_size": 295472,
    "image_type": "image/jpeg",
    "image_url": "https://d2m146bkiftioz.cloudfront.net/7-494bacb0-13ae-11e7-b439-adf9395810da/bcaa-211-400g-proteinfabrikken-1.jpg"
}, {
    "id": 13,
    "product_id": 3,
    "sku": 30000013,
    "name": "BCAA 2:1:1 400g Lemon-Lime",
    "slug": "bcaa-211-400g-lemon-lime",
    "files_id": 1399,
    "image_name": "bcaa-211-400g-proteinfabrikken-3.jpg",
    "image_uuid": "496a1420-13ae-11e7-ba90-ddc728050acd",
    "image_size": 294101,
    "image_type": "image/jpeg",
    "image_url": "https://d2m146bkiftioz.cloudfront.net/7-496a1420-13ae-11e7-ba90-ddc728050acd/bcaa-211-400g-proteinfabrikken-3.jpg"
}]
]

Мне нужно для каждого продукта добавить номер приращения (image_number), я делаю это следующим образом:

$i = 0;
        foreach($product_variants as $key => $value){
            foreach($value as $keys => $values){
                $product_variants[$key]['image_number'] = $i++;
            }
        }

Но конечный результат таков:

[{
    "0": {
        "id": 11,
        "product_id": 3,
        "sku": 30000011,
        "name": "BCAA 2:1:1 400g Fruit Punch",
        "slug": "bcaa-211-400g-fruit-punch",
        "files_id": 1397,
        "image_name": "bcaa-211-400g-proteinfabrikken-1.jpg",
        "image_uuid": "494bacb0-13ae-11e7-b439-adf9395810da",
        "image_size": 295472,
        "image_type": "image/jpeg",
        "image_url": "https://d2m146bkiftioz.cloudfront.net/7-494bacb0-13ae-11e7-b439-adf9395810da/bcaa-211-400g-proteinfabrikken-1.jpg"
    },
    "1": {
        "id": 13,
        "product_id": 3,
        "sku": 30000013,
        "name": "BCAA 2:1:1 400g Lemon-Lime",
        "slug": "bcaa-211-400g-lemon-lime",
        "files_id": 1399,
        "image_name": "bcaa-211-400g-proteinfabrikken-3.jpg",
        "image_uuid": "496a1420-13ae-11e7-ba90-ddc728050acd",
        "image_size": 294101,
        "image_type": "image/jpeg",
        "image_url": "https://d2m146bkiftioz.cloudfront.net/7-496a1420-13ae-11e7-ba90-ddc728050acd/bcaa-211-400g-proteinfabrikken-3.jpg"
    },
    "image_number": 1
}]

Что мне нужно/хочу, так это результат:

[
[{
    "id": 11,
    "product_id": 3,
    "sku": 30000011,
    "name": "BCAA 2:1:1 400g Fruit Punch",
    "slug": "bcaa-211-400g-fruit-punch",
    "files_id": 1397,
    "image_name": "bcaa-211-400g-proteinfabrikken-1.jpg",
    "image_uuid": "494bacb0-13ae-11e7-b439-adf9395810da",
    "image_size": 295472,
    "image_type": "image/jpeg",
    "image_url": "https://d2m146bkiftioz.cloudfront.net/7-494bacb0-13ae-11e7-b439-adf9395810da/bcaa-211-400g-proteinfabrikken-1.jpg"
    "image_number": 0 <--- This
}, {
    "id": 13,
    "product_id": 3,
    "sku": 30000013,
    "name": "BCAA 2:1:1 400g Lemon-Lime",
    "slug": "bcaa-211-400g-lemon-lime",
    "files_id": 1399,
    "image_name": "bcaa-211-400g-proteinfabrikken-3.jpg",
    "image_uuid": "496a1420-13ae-11e7-ba90-ddc728050acd",
    "image_size": 294101,
    "image_type": "image/jpeg",
    "image_url": "https://d2m146bkiftioz.cloudfront.net/7-496a1420-13ae-11e7-ba90-ddc728050acd/bcaa-211-400g-proteinfabrikken-3.jpg"
    "image_number": 1 <--- This
}]
]

Есть ли причина, по которой массив вариантов находится внутри массива?

Keydose 18.07.2019 17:48

Нет @Keydose, я удалил его, мой плохой! API вернул массив, и я сохранил еще один плохой ход. Исправлено сейчас :) Спасибо

Ali Durrani 18.07.2019 17:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Пытаться:

$product_variants[$key][$keys]['image_number'] = $i++;

У вас есть массив, который выглядит так:

array(
    0 => [
        0 => {
            "id": 11
        }, 
        1 => {
            "id": 13
        }
    ]
]

По сути, это настройка вашего многомерного массива, я включил ключи, чтобы вы могли видеть это яснее.

foreach($product_variants as $key => $value) {

    // On the first iteration, $key is equal to 0, and $value is the next array.

    foreach($value as $keys => $values) {

        // On the first iteration, $keys is equal to 0, and $values is the data in the array.

        $product_variants[$key]['image_number'] = $i++;

    }

}

Итак, чтобы получить доступ к фактическим данным, нам нужно сделать следующее:

$product_variants[0][0]['data'] = 'value;

Вы пытались установить информацию в:

$product_variants[0]['data'] = 'value;

Вот почему он устанавливался в корневом массиве, а не в массиве внутри массива.

Спасибо, это сработало! Зачем мне [ключ] и [ключи], когда у меня есть два оператора foreach.

Ali Durrani 18.07.2019 17:43
Ответ принят как подходящий

Есть способы изменить массив с помощью ключа, но я бы использовал ссылку & на открытые значения в foreach:

$i = 0;
foreach($product_variants as &$value){
    foreach($value as &$values){
        $values['image_number'] = $i++;
    }
}
foreach со ссылкой может вызвать побочные эффекты. Используйте $index =>$value и измените индексированное значение в цикле.
Thierry Leroux 18.07.2019 17:56

Вам не нужно 2 цикла foreach(), с одним foreach() вы можете легко добавить image_number.

$array =json_decode($json,1)[0];
foreach($array as $key=>$value){
    $array[$key]['image_number'] = $key;
}
print_r($array);

РАБОЧАЯ ДЕМО:https://3v4l.org/T30B1

Другие вопросы по теме