在PHP中仅对对象/数组的一部分进行排序

时间:2017-03-29 08:48:18

标签: php sorting usort

我已经在这一段时间内挣扎了一段时间,似乎无法获得正确的算法。

我想要的是对此进行排序:

$variable = '{
    "0": {
            "id": "0",
            "code": "main_colour",
            "label": "Main Colour",
            "options": [{
                "id": "825",
                "label": "White",
                "products": ["1", "2", "3"]
            }, {
                "id": "840",
                "label": "Cream",
                "products": ["3", "4", "5"]
            }],
            "position": "0"
        },
    "2": {
           "id": "0",
            "code": "size",
            "label": "Size",
            "options": [{
                "id": "825",
                "label": "S",
                "products": ["1", "2", "3"]
            }, {
                "id": "840",
                "label": "M",
                "products": ["3", "4", "5"]
            }],
            "position": "0"
        }
}';

输出将是

$variable = '{
        "0": {
                "id": "0",
                "code": "main_colour",
                "label": "Main Colour",
                "options": [{
                    "id": "840",
                    "label": "Cream",
                    "products": ["3", "4", "5"]
                },{
                    "id": "825",
                    "label": "White",
                    "products": ["1", "2", "3"]
                }],
                "position": "0"
            },
        "2": {
               "id": "0",
                "code": "size",
                "label": "Size",
                "options": [{
                    "id": "840",
                    "label": "M",
                    "products": ["3", "4", "5"]
                }, {
                    "id": "825",
                    "label": "S",
                    "products": ["1", "2", "3"]
                }],
                "position": "0"
            }
    }';

所以基本上它应该使用"选项"中的标签进行排序。而不影响其他领域。我一直在努力尝试使用不同的算法,但无济于事。

仅对外部"标签"进行排序的当前代码而不是内部标签:

function optionsSort($a, $b) {
return strcmp($a['options'][0]['label'], $b['options'][0]['options']['label']);
}
usort($variable, "optionsSort"));

1 个答案:

答案 0 :(得分:0)

以下是代码:

// your array
$variable = '{
    "0": {
            "id": "0",
            "code": "main_colour",
            "label": "Main Colour",
            "options": [{
                "id": "825",
                "label": "White",
                "products": ["1", "2", "3"]
            }, {
                "id": "840",
                "label": "Cream",
                "products": ["3", "4", "5"]
            }],
            "position": "0"
        },
    "2": {
           "id": "0",
            "code": "size",
            "label": "Size",
            "options": [{
                "id": "825",
                "label": "S",
                "products": ["1", "2", "3"]
            }, {
                "id": "840",
                "label": "M",
                "products": ["3", "4", "5"]
            }],
            "position": "0"
        }
}';

$a = json_decode($variable);
foreach ($a as $item) {
    // sorting function
    usort($item->options, function($a, $b) { return strcmp($a->label, $b->label); });
}