изменить порядок объектов на основе массива

#php #arrays #object

#php #массивы #объект

Вопрос:

У меня есть объект, который выглядит следующим образом:

ОТРЕДАКТИРУЙТЕ фрагмент с примером

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. Ваш подход кажется верным — этот простой пример работает 3v4l.org/d1XDp — не могли бы вы, пожалуйста, предоставить короткий код, который воспроизводит вашу проблему?

2. @dWinder вот оно 3v4l.org/vRZUR

3. Что вы подразумеваете под «объектом изменения порядка»? Я никогда не слышал о параметрах, которые сортируют свойства

4. @NicoHaase объект должен выглядеть как массив order точно так же, с пустыми значениями также

5. Итак, в чем именно заключается вопрос? Если вы приведете этот объект к массиву, вы можете отсортировать его так, как вам нравится. Если он остается объектом, зачем сортировать свойства?

Ответ №1:

Это потому, что некоторые ключи не существуют в, $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

Комментарии:

1. спасибо за ваш ответ, но это неправильно, если вы посмотрите в массиве $ order, между ключами «omschrijving» и «Onderhoudsfirma» должно быть 7 пустых ключей, в вашем фрагменте кода это не так

2. @Michael если вы ожидаете этого, то uksort() это неподходящая функция для использования. Будьте готовы, и я создам новый, который, как мне кажется, может быть ближе к тому, что вы ищете…