基于数组重新排序对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于数组重新排序对象相关的知识,希望对你有一定的参考价值。

我有一个看起来像这样的对象:

EDIT片段示例

https://3v4l.org/vRZUR

var_dump($registerObject)的输出:

{#822 ▼
  +"Sleutel": 1
  +"Gebouw_ID": "20250043814"
  +"Toestel_ID": "BE071   (S035)"
  ...
  +"date": "2019-03-22 08:52:39"
  +"status": 1
  +"done": 0
}

我需要重新定位此对象以匹配此数组顺序:

$order = [
        0 => 'object_id',
        1 => 'Code MCS',
        2 => 'DeviceType',
        ...
        29 => '',
        30 => 'Opmerkingen',
        31 => 'OPMonderhoud',
    ];

这就是我尝试过的;

我将对象转换为一个数组,而不是在数组上使用uksort并使用order数组,我将它与array_search结合起来对数组进行排序。

我想我很接近,但我不确定会出现什么问题。

$registerArray = (array) $registerObject;

uksort($registerArray, function ($a, $b) use ($order) {
    return array_search($a, $order) > array_search($b, $order);
});

这会以奇怪的顺序返回:

array:28 [▼
  "done" => 0
  "Voedingskast" => ""
  "status" => 1
  ...
  "action" => "create"
  "sleutel" => 1
  "OPMonderhoud" => ""
]

我也尝试使用没有键的值来进行$ order数组,它给出了相同的结果。

答案

这是因为$order中不存在某些键,因此它将false与整数进行比较。

这会产生预期的结果:

uksort($registerArray, function ($a, $b) use ($order) {
     $ai = array_search($a, $order);
     $bi = array_search($b, $order);
     return ($ai === false ? INF : $ai) > ($bi === false ? INF : $bi);
});

https://3v4l.org/rPh8t


每条评论更新:

如果需要空点,则它不再是关联数组,不能有多个相同的键;必须是数字。

$newArray = array();
foreach ($order as $k) {
    if (array_key_exists($k, $registerArray)) {
        $newArray[] = $registerArray[$k];
    } else {
        $newArray[] = '';
    }
}

https://3v4l.org/NEetX

以上是关于基于数组重新排序对象的主要内容,如果未能解决你的问题,请参考以下文章

iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。

如何在 Swift 3 中重新排序核心数据对象数组并重新排序它的 Int 属性

falcor:使用路径中的索引来设置项目值

将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久

如何在 Iphone SDK 中基于单个数组对多个数组进行排序

重新排序单元格后如何更改获取结果控制器数组中对象的顺序