Вложенные циклы foreach на объекте json, не возвращающие правильные значения и структуру - PullRequest
0 голосов
/ 16 января 2019

Я не могу понять, почему мой цикл массива не работает.

Я пытаюсь зациклить декодированный объект JSON

+"categoryCode": "1122"
+"category_description": "This is the category Description"
+"products": array:24 [▼
  0 => {#999 ▼
    +"pricing": {#1011 ▼
      +"MainPrice": "40.00"
    }
    +"productInfo": {#1009 ▼
      +"product": {#1014 ▼
        +"product_type": {#1015 ▼
          +"desc": "Test Product"
          +"quantDetails": 3.0
        }
      }
    }
  }

И построить новый $priceResult массив из значений, которые мне нужны.Мне нужна информация о категории на первом уровне массива, а затем информация о продукте.

Почему этот цикл не создает мой новый массив правильно?Когда я сбрасываю $ priceResult, я получаю информацию о категории, но затем я просто получаю цену и набор нулевых значений на одном уровне.Я зацикливаюсь и строю новый массив неправильно?

$priceResult = array();

foreach($pricing->categories as $category){ 

    $priceResult[] = $category->categoryCode;
    $priceResult[] = $category->category_description;

    foreach($category->products as $product){

        foreach ($product->pricing as $price => $amount) {

            $priceResult[] = $amount;

        }

        foreach($product->productInfo as $info){

            foreach($info->product as $product){

                foreach($product->product_type as $type){

                    $priceResult[] = $type->desc;
                    $priceResult[] = $type->quantDetails;
                }
            }
        }
    }
}

Обновление с выводом:

Вот пример некоторого ошибочного вывода

      0 => "CategoryOne"
  1 => "1122"
  2 => "This is the category Description"
  3 => null
  4 => null
  5 => null
  6 => null
  7 => null
  8 => null
  9 => null
  10 => null
  11 => null
  12 => null
  13 => null
  14 => null
  15 => null
  16 => null
  17 => null
  18 => null
  19 => "40.00"
  20 => null
  21 => null
  22 => null
  23 => null
  24 => null
  25 => null
  26 => null
  27 => null
  28 => null
  29 => null
  30 => null
  31 => null
  32 => null
  33 => null
  34 => null
  35 => null
  36 => "50.00"

Обновление с желаемым выводом:

CategoryName : TestCategory
CategoryDescription: For Testing
    Products{
        0{
            Product_code : 123,
            CountNumber : 12,
            ProductDescription: Test Product,
            price_amount : 150.00
        },
        1{
            Product_code : 112,
            CountNumber : 32,
            ProductDescription: Test Product 2,
            price_amount : 250.00
        }
    }

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Я использовал $priceResult как массив, содержащий объекты категорий. Я думаю, что это будет выглядеть примерно так:

$priceResult = array()

foreach($pricing->categories as $category){ 
    $c = new stdClass();
    $c->CategoryCode = $category->categoryCode;
    $c->CategoryDescription = $category->category_description;
    $c->Products = array();

    foreach($category->products as $product){
        $p = new stdClass();
        $p->ProductCode = null; // $product->something? no idea where this is
        $p->CountNumber = $product->productInfo->product->product_type->quantDetails;
        $p->ProductDescription = $product->productInfo->product->product_type->desc;
        $p->PriceAmount = $product->pricing->MainPrice;
        $c->Products[] = $p;
    }
    $priceResult[] = $c;
}

Я должен сказать, что исходные данные выглядят очень странно.

0 голосов
/ 17 января 2019

Попробуйте это:

$categoryArray = [];

foreach($pricing->categories as $category) { 
    $categoryResult['categoryCode'] = $category->categoryCode;
    $categoryResult['CategoryDescription'] = $category->category_description;
    $categoryResult['Products'] = [];
    foreach($category->products as $product) {
        $productResult['Product_code'] = ''; // this doesn't appear in your JSON...
        $productResult['CountNumber'] = $product->productInfo->productType->quantDetails;
        $productResult['ProductDescription'] = $product->productInfo->productType->desc;
        $productResult['price_amount'] = $product->pricing->MainPrice;
        $categoryResult['Products'][] = $productResult;
    }
    $categoryArray[] = $categoryResult;
}

$priceResult = $categoryArray; // ($priceResult is a strange name for this array...)
0 голосов
/ 16 января 2019

$product->pricing и $product->productInfo являются отдельными объектами, а не массивами объектов. Если вы хотите зациклить свойства объекта, вы можете использовать get_object_vars() для возврата ассоциативного массива.

foreach($pricing->categories as $category){ 

    $priceResult[] = $category->categoryCode;
    $priceResult[] = $category->category_description;

    foreach($category->products as $product){
        foreach (get_object_vars($product->pricing) as $amount) {
            $priceResult[] = $amount;
        }
        foreach (get_object_vars($product->productInfo) as $info) {
            $priceResult[] = $info->desc;
            $priceResult[] = $info->quantDetails;
        }
    }
}
...