#php #arrays #object
#php #массивы #объект
Вопрос:
У меня есть объект, который выглядит следующим образом:
ОТРЕДАКТИРУЙТЕ фрагмент с примером
вывод 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);
});
Обновление для комментариев:
Если требуются пустые места, то он больше не может быть ассоциативным массивом, не может иметь несколько одинаковых ключей; должен быть числовым.
$newArray = array();
foreach ($order as $k) {
if (array_key_exists($k, $registerArray)) {
$newArray[] = $registerArray[$k];
} else {
$newArray[] = '';
}
}
Комментарии:
1. спасибо за ваш ответ, но это неправильно, если вы посмотрите в массиве $ order, между ключами «omschrijving» и «Onderhoudsfirma» должно быть 7 пустых ключей, в вашем фрагменте кода это не так
2. @Michael если вы ожидаете этого, то
uksort()
это неподходящая функция для использования. Будьте готовы, и я создам новый, который, как мне кажется, может быть ближе к тому, что вы ищете…