根据数组对对象重新排序

时间:2019-03-27 10:01:20

标签: php arrays object

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

示例示例

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

1 个答案:

答案 0 :(得分: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