Используйте array_multisort () с пользовательской функцией

У меня есть следующий массив, и я бы хотел сортировать его по другому массиву, а не DESC или ASC

 $array = array( 'note' => array('test', 'test1', 'test2', 'test3', 'test4'), 'year' => array('2011','2010', '2012', '2009', '2010'), 'type' => array('journal', 'conference', 'conference', 'conference','conference'), ); 

Можно ли это сделать с помощью настраиваемой функции внутри array_multisort ()?

Например:

 array_multisort($array['type'], $array['year'], custom_function, $array['note']); 

вместо:

 array_multisort($array['type'], $array['year'], SORT_ASC, $array['note']); 

Если вы знаете глубину массива, вы можете просто применить usort для каждого элемента массива для сортировки.

Вот пример, который заказывает в соответствии с настраиваемым массивом:

 <?php $order = array( 'first', 'second', 'third', 'fourth', 'fifth' ); $array = array( array( 'second', 'fourth', 'first', 'third' ), array( 'second', 'first' ) ); foreach($array as &$value) { usort($value, function($a, $b) use($order) { return array_search($a, $order) > array_search($b, $order); }); } unset($value); var_dump($array); /* array(2) { [0]=> array(4) { [0]=> string(5) "first" [1]=> string(6) "second" [2]=> string(5) "third" [3]=> string(6) "fourth" } [1]=> array(2) { [0]=> string(5) "first" [1]=> string(6) "second" } } */ с <?php $order = array( 'first', 'second', 'third', 'fourth', 'fifth' ); $array = array( array( 'second', 'fourth', 'first', 'third' ), array( 'second', 'first' ) ); foreach($array as &$value) { usort($value, function($a, $b) use($order) { return array_search($a, $order) > array_search($b, $order); }); } unset($value); var_dump($array); /* array(2) { [0]=> array(4) { [0]=> string(5) "first" [1]=> string(6) "second" [2]=> string(5) "third" [3]=> string(6) "fourth" } [1]=> array(2) { [0]=> string(5) "first" [1]=> string(6) "second" } } */ 

Если вы не знаете, насколько глубоким может быть массив, единственным решением, которое приходит мне на ум, является рекурсивная функция:

 <?php $order = array( 'first', 'second', 'third', 'fourth', 'fifth' ); $array = array( array( 'second', 'fourth', 'first', 'third' ), array( array('second', 'first'), array('fourth', 'third') ) ); function custom_multisort($array, $order) { foreach($array as &$value) { if(is_array($value[0])) { $value = custom_multisort($value, $order); } else { usort($value, function($a, $b) use($order) { return array_search($a, $order) > array_search($b, $order); }); } } return $array; } $array = custom_multisort($array, $order); var_dump($array); /* array(2) { [0]=> array(4) { [0]=> string(5) "first" [1]=> string(6) "second" [2]=> string(5) "third" [3]=> string(6) "fourth" } [1]=> array(2) { [0]=> array(2) { [0]=> string(5) "first" [1]=> string(6) "second" } [1]=> array(2) { [0]=> string(5) "third" [1]=> string(6) "fourth" } } } */ 

Я думаю, что это невозможно. Вместо того, чтобы делать это

 $custom_function_value = custom_function(); array_multisort($array['type'], $array['year'], $custom_function_value, $array['note']); 

Я думаю, что это даст вам желаемый результат.