2017-04-05 29 views
0

給定以下兩個數組,他們如何有效地合併以產生第三個數組? productDataLaravel 5.3 - 基於2個匹配鍵合併數組?

$productData = 
[ 
    { 
    "product_id": 4, 
    "type": "electronic", 
    "name": "monitor", 
    "specs": { 
     "HDMI": true, 
     "VGA": false 
    } 
    }, 
    { 
    "product_id": 5, 
    "type": "electronic", 
    "name": "HDMI cable", 
    "specs": { 
     "length": "3ft" 
    } 
    }, 
    { 
    "product_id": 6, 
    "type": "kitchen", 
    "name": "spoon" 
    } 
] 

產品

$products = 
{ 
    "products": 3, 
    "per_page": 10, 
    "current_page": 1, 
    "data": [ 
    { 
     "id": 4, 
     "product_type": "electronic", 
     "product_id": 6 
    }, 
    { 
     "id": 6, 
     "type": "electronic", 
     "product_id": 5 
    }, 
    { 
     "id": 9, 
     "type": "kitchen", 
     "product_id": 4 
    } 
    ] 
} 

productsFinal$productData合併成$products - 基於對product_id/product_id匹配組合和type/product_type

$productsFinal = 
{ 
    "products": 3, 
    "per_page": 10, 
    "current_page": 1, 
    "data": [ 
    { 
     "id": 4, 
     "product_type": "electronic", 
     "product_id": 6, 

     // How to merge product data and wrap with "data" key 
     "data": { 
     "product_id": 6, 
     "type": "kitchen", 
     "name": "spoon" 
     } 

    }, 
    { 
     "id": 6, 
     "type": "electronic", 
     "product_id": 5, 

     // How to merge product data and wrap in "data" key 
     "data": { 
     "product_id": 5, 
     "type": "electronic", 
     "name": "HDMI cable", 
     "specs": { 
      "length": "3ft" 
     } 
     } 
    }, 
    { 
     "id": 9, 
     "type": "kitchen", 
     "product_id": 4, 

     // How to merge product data and wrap in "data" key 
     "data": { 
     "product_id": 6, 
     "type": "kitchen", 
     "name": "spoon" 
     } 
    } 
    ] 
} 

我嘗試不同的東西在foreach循環的結果,但仍不能讓它呈現像預期一樣:

foreach($productData as $productDataItem) { 
    // when $productDataItem.product_id == $product.product_id && $productDataItem.type == $product.product_type 
    // move the matching $productDataItem object into matching $product object, wrapped in a new "data" key 
} 
+1

這是不是在這裏的PHP代碼。你試圖自己解決這個問題? – miken32

+0

它是在PHP(Laravel)中,我有這個問題,這是一個laravel集合輸出。我嘗試了幾種不同的方式,但無法完成第三個數組的格式,並且實現時間太長。這就是爲什麼我在'php/laravel'下發布了這個問題,因爲知道laravel的人可能知道如何做到這一點。 – Wonka

+0

您是否試圖爲API做出JSON響應?如果是,我可能會有解決方案。 –

回答

3

我不知道Laravel太好。但是你可以很容易地加入您的數據對象:

<?php 
$productData = json_decode('[ 
    { 
    "product_id": 4, 
    "type": "electronic", 
    "name": "monitor", 
    "specs": { 
     "HDMI": true, 
     "VGA": false 
    } 
    }, 
    { 
    "product_id": 5, 
    "type": "electronic", 
    "name": "HDMI cable", 
    "specs": { 
     "length": "3ft" 
    } 
    }, 
    { 
    "product_id": 6, 
    "type": "kitchen", 
    "name": "spoon" 
    } 
]'); 

$products = json_decode('{ 
    "products": 3, 
    "per_page": 10, 
    "current_page": 1, 
    "data": [ 
    { 
     "id": 4, 
     "type": "electronic", 
     "product_id": 6 
    }, 
    { 
     "id": 6, 
     "type": "electronic", 
     "product_id": 5 
    }, 
    { 
     "id": 9, 
     "type": "kitchen", 
     "product_id": 4 
    } 
    ] 
}'); 

// combine both data objects 

foreach($products->data As &$p) { 
    foreach($productData As $d) { 
     if(property_exists($p, "product_id") && property_exists($d, "product_id") && property_exists($p, "type") && property_exists($d, "type")) { 
      if($p->product_id==$d->product_id && $p->type==$d->type) { 
       //$p = (object) array_merge((array) $p, (array) $d); 
       $p->data = $d; // updated answer 
       continue; 
      } 
     } 
    } 
} 

echo("<pre>"); 
echo json_encode($products, JSON_PRETTY_PRINT); 


?> 

你可以在這裏測試代碼:http://sandbox.onlinephpfunctions.com/code/98a50c35ee32c30f0d2be1661f7afb5895174cbe 更新:http://sandbox.onlinephpfunctions.com/code/aeebfdcf4f4db5e960260e931982570cfed19e0e

+0

謝謝你,它真的接近最終的輸出,但我真的試圖從你的沙箱中輸出'$ productsFinal'(我的最終輸出)中的確切語法來匹配最終輸出。目前有兩個不同之處,即「數據」:['和它將索引添加到每個產品的事實。任何想法如何改變你的邏輯匹配'$ productsFinal'? – Wonka

+0

好的,我更新了我的答案。 – Gerfried

+0

工作得很好,謝謝:) – Wonka

0

我建議要檢查這個包dingo/api。我假設你想顯示某種JSON響應。看看Transformers。你可以做這樣的事情:

<?php 
namespace App\Http\Transformers; 
use App\Http\Controllers\ProductData; 
use League\Fractal\TransformerAbstract; 

class ProductsDataTransformer extends TransformerAbstract 
{ 
    /** 
    * Turn this item object into a generic array 
    * 
    * @return array 
    */ 
    public function transform(ProductData $productdata) 
    { 
     return [ 
      'id' => $productdata->id, 
      'product_type' => $productdata->product_type, 
      'product /*or data*/' => Product::find($productdata->product_id), 
     ]; 
    } 

} 

這會發現該產品通過它的ID,並期待這樣的:

{ 
    "id": 4, 
    "product_type": "electronic", 
    "product" { 
    "product_id": 6, 
    "type": "kitchen", 
    "name": "spoon" 
    }, 
}, 

然後,您可以還創建一個變壓器產品來滿足您的規格屬性護理做同樣的事情。