【问题标题】:How to order array of objects by property PHP如何按属性PHP对对象数组进行排序
【发布时间】:2021-10-21 12:46:45
【问题描述】:

我有以下来自 json 的对象数组。这个想法是按观察属性排序。我该怎么做?

我的对象数组

[
    [
        "id" => "07e17609-2359-4b21-9161-6e10715eb2f1",
        "description" => "Digital Account",
        "observation" => null
    ],
    [
        "id" => "1f9a3695-dafe-46yb-9caa-7a413bedc3c9",
        "description" => "Cashback",
        "observation" => '1% cashback on all purchases using Méliuz'
    ],
    [
        "id" => "0f9a5695-dafe-46fb-9caa-7a418bedc3c9",
        "description" => "Google Pay",
        "observation" => null
    ],
];

所需的排序输出

[
    [
        "id" => "1f9a3695-dafe-46yb-9caa-7a413bedc3c9",
        "description" => "Cashback",
        "observation" => '1% cashback on all purchases using Méliuz'
    ],
    [
        "id" => "07e17609-2359-4b21-9161-6e10715eb2f1",
        "description" => "Digital Account",
        "observation" => null
    ],
    [
        "id" => "0f9a5695-dafe-46fb-9caa-7a418bedc3c9",
        "description" => "Google Pay",
        "observation" => null
    ],
];

即如果观察字段不为空,则必须排在第一位

我用下面的 usert 试过了,但是没用。

usort($this->rewards, fn($a, $b) => strcmp($a->observation, $b->observation));

【问题讨论】:

  • 您的 JSON 不是 JSON。它是从中提取的一块。有效的 JSON 不能以 "rewards": 开头。此外,JSON 没有单引号字符串文字。你能提供有效的 JSON 吗?
  • 您需要做的第一件事是使用json_decode 将JSON 数据转换为数组。然后,您可以使用array_multisort 对其进行排序。检查php.net/manual/en/function.array-multisort.php,特别是第三个例子。
  • @trincot,我更新了我的 quetstion only 数组

标签: php arrays json sorting


【解决方案1】:

您可以按如下方式扩展您的usort 回调函数:

usort($data->rewards, fn ($a, $b) =>
    is_null($a->observation) - is_null($b->observation) || 
    strcmp($a->observation, $b->observation)
);

这将强制 null 值结束。

【讨论】:

  • usort 总是返回一个布尔值。您需要查看$data->rewards,这将是已排序的。这就是所有 PHP 排序函数的工作方式。查看他们的文档。
猜你喜欢
  • 2014-09-17
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2012-02-20
相关资源
最近更新 更多