переупорядочить объект на основе массива - PullRequest
0 голосов
/ 27 марта 2019

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

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

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 намассив и использовать массив порядка, и я объединяю это с 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 голосов
/ 27 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...