Сортировать значения массива по определенному порядку, заданному в другом массиве - PullRequest
1 голос
/ 23 мая 2019

У меня есть этот массив в правильном порядке:

$orderDoc = array("ORT", "TRI", "CONT", "RMI");

Эти документы находятся в разных таблицах нескольких серверов и базы данных.
В конце поиска документов, которые я обычно получаюмассив со следующей структурой, но с элементами в беспорядке:

// имитируемая переменная:

$FindDoc= array("RMI0000191","ORT0000379","ORT0000391","ORT0000392","ORT0000390","CONT0000274","CONT0000275","RMI0000192","ORT0000391");

Ouput:

array(10) {
  [0]=>
  string(10) "RMI0000191"
  [1]=>
  string(10) "ORT0000379"
  [2]=>
  string(10) "ORT0000391"
  [3]=>
  string(10) "ORT0000392"
  [4]=>
  string(10) "ORT0000390"
  [5]=>
  string(11) "CONT0000274"
  [6]=>
  string(11) "CONT0000275"
  [7]=>
  string(10) "RMI0000192"
  [8]=>
  string(10) "ORT0000394"
  [9]=>
  string(10) "TRI0000170"
}

Я пытаюсь использовать это, ноэто не работаетЯ получаю сообщение об ошибке, поскольку второй параметр должен быть целым числом:

$FindDoc=asort($FindDoc,$orderDoc );

После исследования ни одна из этих функций не работает:

PHP - Sort Functions For Arrays
In this chapter, we will go through the following PHP array sort functions:

sort() - sort arrays in ascending order
rsort() - sort arrays in descending order
asort() - sort associative arrays in ascending order, according to the value
ksort() - sort associative arrays in ascending order, according to the key
arsort() - sort associative arrays in descending order, according to the value
krsort() - sort associative arrays in descending order, according to the key

https://www.w3schools.com/php/php_arrays_sort.asp

Как получить правильный порядок значений?

Пример того, что ожидалось, порядок по $ orderDoc ordes и По числовому документу:

array(10) {
  [0]=>
  string(10) "ORT0000379"
  [1]=>
  string(10) "ORT0000390"
  [2]=>
  string(10) "ORT0000391"
  [3]=>
  string(10) "ORT0000392"
  [4]=>
  string(10) "ORT0000394"
  [5]=>
  string(10) "TRI0000170"
  [6]=>
  string(11) "CONT0000274"
  [7]=>
  string(11) "CONT0000275"
  [8]=>
  string(10) "RMI0000191"
  [9]=>
  string(10) "RMI0000192"
}

ОбновлениеЯ пытаюсь использовать пользовательскую функцию, но получаю некоторые ошибки:

foreach ($FindDoc as $StructureMember) {
    $key = array_search($StructureMember, function ($StructureMember, $orderDoc ) {
        return (strpos($StructureMember, $orderDoc ));
    });
    $result[$key] = $StructureMember;
}
$FindDoc = $result;

вывод:

Warning: array_search() expects parameter 2 to be array, object given in C:\xampp\htdocs\class\class.docinfo.php on line 15

1 Ответ

1 голос
/ 23 мая 2019

Цикл orderdoc и использование preg_grep для получения всех элементов массива, которые начинаются с одинаковых символов.
Затем отсортируйте возвращаемый массив и объедините его с результирующим массивом.

$orderDoc = array("ORT", "TRI", "CONT", "RMI");

$FindDoc= array("RMI0000191","ORT0000379","ORT0000391","ORT0000392","ORT0000390","CONT0000274","CONT0000275","RMI0000192","ORT0000391");

$result =[];
foreach($orderDoc as $doc){
    $temp = preg_grep("/^". preg_quote($doc) . "/", $FindDoc);
    sort($temp);
    $result = array_merge($result, $temp);
}

var_dump($result);

$ результат:

array(9) {
  [0]=>
  string(10) "ORT0000379"
  [1]=>
  string(10) "ORT0000390"
  [2]=>
  string(10) "ORT0000391"
  [3]=>
  string(10) "ORT0000391"
  [4]=>
  string(10) "ORT0000392"
  [5]=>
  string(11) "CONT0000274"
  [6]=>
  string(11) "CONT0000275"
  [7]=>
  string(10) "RMI0000191"
  [8]=>
  string(10) "RMI0000192"
}

https://3v4l.org/eqUBv

Обратите внимание: это сохраняет дубликаты из вашего массива.
Вы не говорите, что они должны быть удалены, но если вы хотите, чтобы они были удалены, просто добавьте array_unique () до слияния temp с $ result

...