基于数组重新排序对象

问题描述 投票:0回答:1

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

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数组,它给出了相同的结果。

php arrays object
1个回答
0
投票

这是因为$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

© www.soinside.com 2019 - 2024. All rights reserved.