Étant donné les deux tableaux suivants, comment peuvent-ils être fusionnés efficacement pour obtenir le troisième tableau? productData

$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"
  }
]

produits

$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 fusionné avec $products - en fonction de la combinaison correspondante de product_id/product_id et 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"
      }
    }
  ]
}

J'ai essayé différentes choses pour le résultat dans une boucle foreach mais je ne parviens toujours pas à le rendre comme prévu:

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
}
0
Wonka 6 avril 2017 à 01:16

2 réponses

Meilleure réponse

Je ne connais pas trop bien Laravel. Cependant, vous pouvez joindre vos objets de données assez facilement:

<?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);


?>

Vous pouvez tester le code ici: http://sandbox.onlinephpfunctions.com/code/98a50fc357bebeebeeb.com/code/98a50fc354beebeeb Mise à jour: http://sandbox.onlinephpfunctions.com/code/aeeb2fdcf4709609fdcf4

3
Gerfried 9 avril 2017 à 09:56

Je suggère de vérifier ce package dingo / api. Je suppose que vous souhaitez afficher une sorte de réponse JSON. Jetez un œil à Transformers. Vous pouvez faire quelque chose comme ceci:

<?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),
        ];
    }

}

Cela trouverait le produit par son ID et ressemblerait à ceci:

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

Vous pouvez également créer un transformateur pour que Product s'occupe de votre attribut de spécifications pour faire la même chose.

0
Jonathan Bouchard 8 avril 2017 à 00:18