2017-05-29 46 views
0

我有這個數組對象:PHP - 移動陣列內的關鍵和壓平

[ 
    { 
    "id": 1, 
    "name": "Carbo", 
    "menus": [ 
     { 
     "id": 33, 
     "name": "FloralWhite", 
     "image": { 
      "web": "https://lorempixel.com/640/360/food/?89722", 
      "mobile": "https://lorempixel.com/640/360/food/?89722", 
      "square": "https://lorempixel.com/640/360/food/?89722" 
     }, 
     "logs": { 
      "price": 2 
     } 
     }, 
     { 
     "id": 40, 
     "name": "LightGray", 
     "image": { 
      "web": "https://lorempixel.com/640/360/food/?63930", 
      "mobile": "https://lorempixel.com/640/360/food/?63930", 
      "square": "https://lorempixel.com/640/360/food/?63930" 
     }, 
     "logs": { 
      "price": 2 
     } 
     }, 
    ] 
    } 
] 

我想達到的目標:

[ 
    { 
    "id": 1, 
    "name": "Carbo", 
    "menus": [ 
     { 
     "id": 33, 
     "name": "FloralWhite", 
     "image": { 
      "web": "https://lorempixel.com/640/360/food/?89722", 
      "mobile": "https://lorempixel.com/640/360/food/?89722", 
      "square": "https://lorempixel.com/640/360/food/?89722" 
     }, 
      "price": 2 
     }, 
     { 
     "id": 40, 
     "name": "LightGray", 
     "image": { 
      "web": "https://lorempixel.com/640/360/food/?63930", 
      "mobile": "https://lorempixel.com/640/360/food/?63930", 
      "square": "https://lorempixel.com/640/360/food/?63930" 
     }, 
      "price": 2 
     }, 
    ] 
    } 
] 

我使用laravel收集與扁平化嘗試深度但它失敗

$data = collect($data->menus); 

$data = $data->flatten(1); 
$data->values()->all(); 

我該如何展平菜單['logs']對象,以便它可以與菜單一個級別?

+0

你想刪除「日誌」父鍵? –

+0

@BunkerBoy我想刪除它,並將所有內容「日誌」移動到其父菜單對象 – ssuhat

+0

在這樣的時候,你不得不使用laravel的關係..使用連接,而不是..如果你想要的東西那樣.. – Demonyowh

回答

2

像這樣的東西應該能夠做到。只需遍歷數組,設置新屬性並刪除不需要的屬性。

 $data = json_decode("[{ 
     \"id\": 1, 
     \"name\": \"Carbo\", 
     \"menus\": [ 
      { 
       \"id\": 33, 
       \"name\": \"FloralWhite\", 
       \"image\": { 
        \"web\": \"https://lorempixel.com/640/360/food/?89722\", 
        \"mobile\": \"https://lorempixel.com/640/360/food/?89722\", 
        \"square\": \"https://lorempixel.com/640/360/food/?89722\" 
      }, 
      \"logs\": { 
       \"price\": 2 
      } 
     }, 
     { 
      \"id\": 40, 
      \"name\": \"LightGray\", 
      \"image\": { 
       \"web\": \"https://lorempixel.com/640/360/food/?63930\", 
       \"mobile\": \"https://lorempixel.com/640/360/food/?63930\", 
       \"square\": \"https://lorempixel.com/640/360/food/?63930\" 
      }, 
      \"logs\": { 
       \"price\": 2 
      } 
     } 
    ] 
    }]"); 

foreach($data as $val){ 
    foreach($val->menus as $menuVal){ 
     $menuVal->price = $menuVal->logs->price; 
     unset($menuVal->logs); 
    } 
} 
+0

我試過,但它返回'未定義的偏移量0' – ssuhat

+0

@StefenSuhat我已經更新了我的答案,你可以再試一次嗎? –

0

@Stefen Suhat我真的不知道什麼是laravel的語法,但我有一個簡單的PHP的foreach(做的)希望這會幫助你,因爲你的陣列的深度很長,所以我去了您陣列的所有級別,校驗碼,在這裏輸出片斷https://eval.in/806879

嘗試以下之一:

<?php 
$array = array(
      array(
        "id"=> 1, 
        "name"=> "Carbo", 
        "menus"=> array(
        array(
         "id"=> 33, 
         "name"=> "FloralWhite", 
         "image"=> array(
          "web"=> "https=>//lorempixel.com/640/360/food/?89722", 
          "mobile"=> "https=>//lorempixel.com/640/360/food/?89722", 
          "square"=> "https=>//lorempixel.com/640/360/food/?89722" 
        ), 
        "logs"=> array(
         "price"=> 2 
        ) 
       ), 
        array(
        "id"=> 40, 
        "name"=> "LightGray", 
        "image"=> array(
         "web"=> "https=>//lorempixel.com/640/360/food/?63930", 
         "mobile"=> "https=>//lorempixel.com/640/360/food/?63930", 
         "square"=> "https=>//lorempixel.com/640/360/food/?63930" 
        ), 
        "logs"=> array(
         "price"=> 2 
        ) 
       ), 
       ) 
      ) 
     ); 

foreach($array as $key => $value){ 
    foreach ($value as $key1 => $value1) { 
     if(is_array($value1) && $key1 == "menus"){ 
      foreach($value1 as $key2 => $value2) { 
       foreach ($value2 as $key3 => $value3) { 
        if(is_array($value3) && $key3 == "logs"){ 
         unset($array[$key][$key1][$key2][$key3]); 
         $array[$key][$key1][$key2] = array_merge($array[$key][$key1][$key2], $value3); 
        } 
       } 

      } 

     } 
    } 
} 
echo "array after<br>"; 
echo "<pre>"; 
print_r($array); //your array after 
?>