增加嵌套对象内的值

时间:2016-08-09 11:16:01

标签: php oop object

[PHP]

我有一个$ cart对象(json_encoded)看起来像这样:

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

我想增加具有id=23size=large的项目的数量,是否有一种优雅的方式来识别该特定值并增加它而不会遍历所有项目和重新创建对象?

谢谢!

2 个答案:

答案 0 :(得分:1)

没有循环,但通过过滤,您可以选择欲望元素。

使用json_decode并将数据设为objects而不是array,以便保留参考。

以下是一个例子

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

答案 1 :(得分:0)

我不这么认为。

假设您使用了json_decode,我可以想出的最佳方法是遍历每个项目,查找您要更新其项目的ID,执行更新并中断循环:

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

    continue;
}

假设您不想使用json_decode,可以使用preg_replace,但坦率地说,它没有您要求的优雅。