2016-08-09 17 views
0

[PHP]Increment Wert innerhalb verschachtelten Objekten

ich ein $ Wagen bezwecken, dass (json_encoded) sieht wie folgt aus:

{"merchant_id":"5","items":[{"id":"23”,”size”:”small”,”price":"3","quantity”:1},{"id":"23”,”size":" 
large","price":"3","quantity”:1},{"id":"24”,”size”:”medium”,”price":"3","quantity":1}]} 

Ich möchte die Menge des Artikels erhöhen, die id=23 hat und size=large, gibt es eine elegante Möglichkeit, diesen spezifischen Wert zu identifizieren und zu inkrementieren, ohne alle Elemente durchzulaufen und das Objekt neu zu erstellen?

Vielen Dank!

+3

Einfache Antwort NEIN – RiggsFolly

+0

Was meinen Sie ohne neu erstellt das Objekt? Json_decode nicht verwenden? – Whiteulver

Antwort

1

Ohne Schleife, aber mit Filterung können Sie das gewünschte Element auswählen.

Verwenden Sie json_decode und erhalten Sie Daten als objects nicht als array so können Referenzen beibehalten.

ein Beispiel ist die folgende

<?php 

$json = '{ 
    "merchant_id": "5", 
    "items": [{ 
     "id": "23", 
     "size": "small", 
     "price": "3", 
     "quantity": 1 
    }, { 
     "id": "23", 
     "size": "large", 
     "price": "3", 
     "quantity": 1 
    }, { 
     "id": "24", 
     "size": "medium", 
     "price": "3", 
     "quantity": 1 
    }] 
}'; 

$cart = json_decode($json); # Decode as stdClass objects 

# Filter desire element 
$item = array_filter($cart->items, function ($i) { 
    return $i->id == "23" && $i->size == 'large'; 
}); 

# array_filter returns array so get the first element. 
# you could check if $item is false. 
$item = reset($item); 
# increase quantity 
$item->quantity++; 

# Encode json data 
$json = json_encode($cart); 

echo $json; 
+0

Perfekte Lösung, wusste nicht, dass es das ursprüngliche Objekt aktualisieren würde! –

0

Ich glaube nicht.

Angenommen, Sie verwenden json_decode, den besten Weg, ich kann kommen über jeden Artikel iteriert, sucht die ID Sie dessen Element, das Sie aktualisieren mögen, führen Sie Update und bricht die Schleife:

foreach($cart['items'] as $k => $item){ 
    if($item['id'] == 23){ 
     $cart['items'][$k]['quantity']++; 
     break; 
    } 

    continue; 
} 

Unter der Annahme, Sie möchten nicht json_decode verwenden, könnten Sie preg_replace verwenden, aber ehrlich gesagt hat es nicht die Eleganz, die Sie gefragt haben.

Verwandte Themen