2017-04-05 10 views
0

次の2つの配列が与えられた場合、どのように効率的にマージして3番目の配列を得ることができますか? 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は -

$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" 
     } 
    } 
    ] 
} 
$productData$productsにマージ一致 product_id/product_idのコンボと type/product_typeに基づきます)

私は、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コレクションの出力です。私はいくつかの方法を試しましたが、3番目の配列のフォーマットを達成することができず、実装に時間がかかりすぎています。だから、laravelを知っている誰かがこれを行う方法を知っているかもしれないので、私は 'php/laravel'の下で質問を投稿したのです。 – Wonka

+0

APIのJSONレスポンスを作成しようとしていますか?はいの場合は、解決策があるかもしれません。 –

答えて

3

私はララベルもよく分かりません。しかし、あなたは非常に簡単にデータオブジェクトを結合することができます。

<?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'(私の最終出力)に正確な構文を得ようとしています。最終出力と一致するようにサンドボックスから出力されます。現在のところ、2つの違い、 ''データ '': ''と各製品にインデックスを追加するという事実があります。 '$ productsFinal'にマッチするようにロジックを変更する方法はありますか? – Wonka

+0

さて、私は私の答えを更新しました。 – Gerfried

+0

非常にうまく動作します、ありがとう:) – Wonka

0

私は、このパッケージdingo/apiをチェックすることをお勧め。 JSONレスポンスのいくつかを表示したいと思います。 Transformersをご覧ください。あなたは、その後もあなたのスペック属性の世話をするために製品のための変圧器を作成することができます

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

<?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によって製品を見つけ、次のようになります。あなたはこのような何かを行うことができます同じことをする。

関連する問題