PHP получает значения из 2 foreach

#php

#php

Вопрос:

У меня есть некоторые проблемы с получением значений из foreach в foreach. Итак, я получаю некоторые значения из базы данных и запрашиваю их в функции, но у этих значений есть другой foreach, поэтому мне нужно их объединить.

Итак, мой ответ, который я запрашиваю, выглядит так:

 "attributes": [
        {
            "id": "404954fd-38c4-4865-9e0b-41588aa6b0af",
            "attribute_id": "85dcb141-d0f6-4e89-872a-efb2dad156d9",
            "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
            "order": null,
            "created_at": "2021-02-08T14:03:12.000000Z",
            "updated_at": "2021-02-08T14:03:12.000000Z",
            "values": [
                {
                    "id": "427fa40e-53f2-4b69-84fe-a24e9d4a7411",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "404954fd-38c4-4865-9e0b-41588aa6b0af",
                    "value_id": "174eee1f-1d49-43be-b2c7-f048fa38443e",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                },
                {
                    "id": "47338db2-1523-4972-970e-bdf491860d0d",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "404954fd-38c4-4865-9e0b-41588aa6b0af",
                    "value_id": "907ce021-dc66-4d85-acfb-0a11754131d4",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                },
                {
                    "id": "b5a701ec-aea5-4651-a303-5206ee4dbcaa",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "404954fd-38c4-4865-9e0b-41588aa6b0af",
                    "value_id": "b3551cd3-a173-46ff-aa26-9ea294f47a65",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                }
            ]
        },
        {
            "id": "5fc456c7-79c9-4689-ba29-ca81c8d5488c",
            "attribute_id": "ca4fca45-c8a5-496d-a054-3d9e565594a7",
            "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
            "order": null,
            "created_at": "2021-02-08T14:03:12.000000Z",
            "updated_at": "2021-02-08T14:03:12.000000Z",
            "values": [
                {
                    "id": "4718415b-05b0-4f67-bf53-1df76c4a7ee6",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "5fc456c7-79c9-4689-ba29-ca81c8d5488c",
                    "value_id": "e49efb03-f89b-4528-b4a9-e052288f112a",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                },
                {
                    "id": "e371f735-63df-4cbe-ad20-081fc6cfe3e9",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "5fc456c7-79c9-4689-ba29-ca81c8d5488c",
                    "value_id": "0984746e-3a7d-4767-87a0-12a2b3d0cbbf",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                }
            ]
        },
        {
            "id": "a7f581aa-29b2-45b1-80df-3ccd9ea86755",
            "attribute_id": "f3e2ffdd-02f5-45fc-bcd5-5c732d0783bc",
            "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
            "order": null,
            "created_at": "2021-02-08T14:03:12.000000Z",
            "updated_at": "2021-02-08T14:03:12.000000Z",
            "values": [
                {
                    "id": "2658d7f7-c91a-4f8b-a565-ef6e53e820c2",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "a7f581aa-29b2-45b1-80df-3ccd9ea86755",
                    "value_id": "651f2f70-58e7-4b85-b161-045d35e00dca",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                },
                {
                    "id": "4d1a30b7-5daf-4c21-879c-93a917bb2778",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "a7f581aa-29b2-45b1-80df-3ccd9ea86755",
                    "value_id": "a6382c6d-87f3-416a-8400-d8ccf0385393",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                },
                {
                    "id": "5e7e952f-eb3b-423b-9eb3-c00daa5ca103",
                    "products_id": "eb7f0faf-7bff-45e5-bdb9-a6db1e05c4f5",
                    "product_attributes_id": "a7f581aa-29b2-45b1-80df-3ccd9ea86755",
                    "value_id": "2e47215e-5dec-4dd2-bd26-4c0b9f09d917",
                    "order": null,
                    "created_at": "2021-02-08T14:03:12.000000Z",
                    "updated_at": "2021-02-08T14:03:12.000000Z"
                }
            ]
        }
    ]
 

Итак, чтобы научить их, я делаю вот так:

 foreach ($product['attributes'] as $key => $attr) {
            $attr_label =  Attributes::where('id', $attr['attribute_id'])->firstOrFail()['label'];

            foreach ($attr['values'] as $key => $value) {
                $attr_value = AttributeValue::where('id', $value['value_id'])->firstOrFail()['value'];
            }
        }
 

Как вы видите, я ищу атрибут с определенным идентификатором, и после этого я ищу значения, которые назначены для этого атрибута.
Как сделать так, чтобы ответ из foreach выглядел примерно так:

 {
    "Size": [
        "M",
        "X",
        "XL"
    ],
    "Material": [
        "Plastic",
        "Cotton"
    ],
    "Color": [
        "Red",
        "Black",
        "Green"
    ]
}
 

Я попробовал что-то вроде:

 $for_attributes = array();

        foreach ($product['attributes'] as $key => $attr) {
            $for_attributes['label'] .=  Attributes::where('id', $attr['attribute_id'])->firstOrFail()['label'];

            foreach ($attr['values'] as $key => $value) {
                $for_attributes['value'] .= AttributeValue::where('id', $value['value_id'])->firstOrFail()['value'];
            }
        }

        return $for_attributes;
 

Но он всегда говорит, как:

Исключение ErrorException: неопределенный индекс: метка в файле

Комментарии:

1. Неясно, каким вы ожидаете получить свой результат, но, похоже, вы хотите создать результирующий массив? Хотя я думаю, было бы лучше, если бы вы попытались получить именно то, что хотите, с помощью одного запроса.

2. Что бы вы ни пытались сделать, ваш код перезаписывается $attr_label и $attr_value все время

3. Я обновил вопрос

Ответ №1:

Хорошо, я сделал это так:

 $for_attributes = array();

        foreach ($product['attributes'] as $keys => $attr) {
            $for_attributes[$keys]['label'] =  Attributes::where('id', $attr['attribute_id'])->firstOrFail()['label'];

            foreach ($attr['values'] as $key => $value) {
                $for_attributes[$keys]['value'][] = AttributeValue::where('id', $value['value_id'])->firstOrFail()['value'];
            }
        }

        return $for_attributes;