PHP – сортировка элементов массива на основе элементов другого массива :)

поэтому у меня есть два массива. один из них выглядит так (это значения или количество элементов может меняться):

array('4dec' , 'def3', 'a3d6', 'd12f'); 

и другие:

 array(array('id' => 'd12f', 'name' => 'John'), array('id' => 'a5f1', 'name' => 'Kathy'), array('id' => 'def3', 'name' => 'Jane'), array('id' => 'a3d6', 'name' => 'Amy'), array('id' => '4dec', 'name' => 'Mary'), array('id' => 'ecc2', 'name' => 'Fred')); 

(это не должно меняться, элементы и значения одинаковы каждый раз).

обратите внимание, что у первого есть несколько элементов из второго. Как я могу отсортировать второй массив на основе элементов из первого?

поэтому в основном, в этом случае 2-й массив должен стать:

 array(array('id' => '4dec', 'name' => 'Mary'), array('id' => 'def3', 'name' => 'Jane'), array('id' => 'a3d6', 'name' => 'Amy'), array('id' => 'd12f', 'name' => 'John'), array('id' => 'a5f1', 'name' => 'Kathy'), array('id' => 'ecc2', 'name' => 'Fred')); 

(элементы, которые существуют в 1-м, перемещаются вверху, в том же порядке, что и 1-й, а остальные оставлены в покое).

Solutions Collecting From Web of "PHP – сортировка элементов массива на основе элементов другого массива :)"

Стабильность была изюминкой, так как PHP этого больше не уважает, но небольшая дополнительная работа сохраняет стабильную сортировку.

 $order_by = array('4dec' , 'def3', 'a3d6', 'd12f'); $data = array(array('id' => 'd12f', 'name' => 'John'), array('id' => 'a5f1', 'name' => 'Kathy'), array('id' => 'def3', 'name' => 'Jane'), array('id' => 'a3d6', 'name' => 'Amy'), array('id' => '4dec', 'name' => 'Mary'), array('id' => 'ecc2', 'name' => 'Fred')); // create a lookup table for sorted order to avoid repeated searches $order_index = array_flip($order_by); // create a lookup table for original order: in PHP 4.1.0 usort became unstable // http://www.php.net/manual/en/function.usort.php $orig_order_by = array_map(function($a){return $a['id'];}, $data); $orig_index = array_flip($orig_order_by); // sort values by specified order, with stability $compare = function($a, $b) use (&$order_index, &$orig_index) { $aid = $a['id']; $bid = $b['id']; $ai = $order_index[$aid]; $bi = $order_index[$bid]; if ($ai === null and $bi === null) { // original sort order for stability return $orig_index[$aid] - $orig_index[$bid]; } if ($ai === null) { return 1; } if ($bi === null) { return -1; } return $ai - $bi; }; usort($data, $compare); var_dump($data);