foreach внутри foreach и вне положить первый foreach в массиве - PullRequest
0 голосов
/ 25 февраля 2020

Предположим, у меня есть array с именем (data) и внутри моего массива у меня есть foreach для продуктов. Мне нужно получить каждый из этих пакетов продуктов внутри этого массива (данных).

Вот что я пробовал:

foreach ( $products as $product ) {
    $data[] = [
        'id' => $product->id,
        'packages' => [],
    ]

    foreach ( $product->packageId as $package ) {
        $data[]['packages'] = [
            'package_id' => $package['id'],
        ];
    }
}

Это возвращает:

- 0 [   
  id: 977
  packages:  []
]

- 1 [   
  packages   
  package_id: 14
]

- 2 [
  packages    
  package_id: 15
]

Мне нужно вернуть что-то вроде этого:

- 0 [   
  id: 977
  packages: [
    package_id: 14,
    package_id: 15
  ]
]

Обновить

как @Helioarch и @albus_severus, упомянутые в их ответах, что я должен сначала создать массив пакетов, а затем включите это в массив данных

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

Например

  • продукт 1 имеет пакеты [1 , 2,3]
  • товар 2 имеет пакеты [4,5,6]

в этом моем случае здесь он станет

  • товар 1 есть пакеты [1,2,3]
  • продукт 2 будет иметь пакеты [1,2,3,4,5,6] <- ведьма не права. </li>

Обновление 2

Вот мой полный код

foreach ( $products as $product ) {
            $sums = 0;
            foreach ( $product->packageId as $package ) {
                // Get the total existing inventory
                $pckInvSum = $package->pckInventories
                    ->where( 'expiry_date', '<', Carbon::today() )
                    ->where( 'type', 'existing' )->sum( 'amount' );
                // Get the total virtual inventory
                $pckInvVirtual = $package->pckInventories->where( 'type', 'virtual' )->sum( 'amount' );
                // create new array packages to add it to the main json
                $packages[] = [
                    'package_id'    => $package['id'],
                    'package_price' => $package['price'],
                    'unit_count'    => $package['unit_count'],
                    'existing'      => $pckInvSum,
                    'virtual'       => $pckInvVirtual
                ];
                $sums       += $package->pckInventories->sum( 'amount' );
            }
            $data[] = [
                'id'                      => $product->id,
                'product_category_id'     => $product->product_category_id,
                'child_category_id'       => $product->child_category_id,
                'child_category_two_id'   => $product->child_category_two_id,
                'child_category_three_id' => $product->child_category_three_id,
                'supplier_id'             => $product->supplier_id,
                'supplier_name'           => $product->supplier->contact_name,
                'option_category_id'      => $product->option_category_id,
                'tax_id'                  => $product->tax_id,
                'barcode'                 => $product->barcode,
                'low_price'               => $product->low_price,
                'image'                   => $product->image,
                'cost'                    => $product->cost,
                'name_ar'                 => $product->translations[0]->name,
                'name_en'                 => $product->translations[1]->name,
                'details_ar'              => $product->translations[0]->details,
                'details_en'              => $product->translations[1]->details,
                'sumInv'                  => $sums,
                'campaign'                => [
                    'id'              => $product->campaign[0]->id,
                    'product_id'      => $product->campaign[0]->product_id,
                    'price'           => $product->campaign[0]->price,
                    'purchasesLimits' => $product->campaign[0]->purchasesLimits,
                ],
                'packages'                => $packages,
            ];

1 Ответ

3 голосов
/ 25 февраля 2020

Сначала вы должны создать массив пакетов, а затем включить его в массив данных следующим образом:

foreach ( $products as $product ) {
  $packages = [];

  foreach ( $product->packageId as $package ) {
     $packages[] = [
        'package_id'    => $package['id'],
     ];
  }

  $data[] = [
    'id' => $product->id,
    'packages ' => $packages,
  ]
}

РЕДАКТИРОВАТЬ:

Пожалуйста, попробуйте еще раз с исправленной версией кода, который вы предоставляете ниже .

foreach ( $products as $product ) {
    $sums = 0;
    $packages = [];

    foreach ( $product->packageId as $package ) {

        // Get the total existing inventory
        $pckInvSum = $package->pckInventories
            ->where( 'expiry_date', '<', Carbon::today() )
            ->where( 'type', 'existing' )->sum( 'amount' );

        // Get the total virtual inventory
        $pckInvVirtual = $package->pckInventories->where( 'type', 'virtual' )->sum( 'amount' );

        // create new array packages to add it to the main json
        $packages[] = [
            'package_id'    => $package['id'],
            'package_price' => $package['price'],
            'unit_count'    => $package['unit_count'],
            'existing'      => $pckInvSum,
            'virtual'       => $pckInvVirtual
        ];

        $sums += $package->pckInventories->sum( 'amount' );
    }

    $data[] = [
        'id'                      => $product->id,
        'product_category_id'     => $product->product_category_id,
        'child_category_id'       => $product->child_category_id,
        'child_category_two_id'   => $product->child_category_two_id,
        'child_category_three_id' => $product->child_category_three_id,
        'supplier_id'             => $product->supplier_id,
        'supplier_name'           => $product->supplier->contact_name,
        'option_category_id'      => $product->option_category_id,
        'tax_id'                  => $product->tax_id,
        'barcode'                 => $product->barcode,
        'low_price'               => $product->low_price,
        'image'                   => $product->image,
        'cost'                    => $product->cost,
        'name_ar'                 => $product->translations[0]->name,
        'name_en'                 => $product->translations[1]->name,
        'details_ar'              => $product->translations[0]->details,
        'details_en'              => $product->translations[1]->details,
        'sumInv'                  => $sums,
        'campaign'                => [
            'id'              => $product->campaign[0]->id,
            'product_id'      => $product->campaign[0]->product_id,
            'price'           => $product->campaign[0]->price,
            'purchasesLimits' => $product->campaign[0]->purchasesLimits,
        ],
        'packages'                => $packages,
    ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...