Ale*_*lex 4 php arrays sorting
所以我有两个数组.其中一个看起来像这样(它的值或元素的数量可以改变):
array('4dec' , 'def3', 'a3d6', 'd12f');
Run Code Online (Sandbox Code Playgroud)
和另外一个:
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'));
Run Code Online (Sandbox Code Playgroud)
(这个不应该改变,元素和值每次都是相同的).
注意第一个有第二个元素.如何根据第一个元素对第二个数组进行排序?
基本上,在这种情况下,第二个数组应该成为:
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'));
Run Code Online (Sandbox Code Playgroud)
(第一个中存在的元素在顶部移动,顺序与第一个相同,其他元素保持不变).
稳定性是一个扭曲,因为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);
Run Code Online (Sandbox Code Playgroud)