2010-04-21 2 views
4

Есть 2 массивов, оба с одинаковой длиной и с тем же ключами:Сортировка массив по ключам другого массива

$a1 = [1=>2000,65=>1354,103=>1787]; 
$a2 = [1=>'hello',65=>'hi',103=>'goodevening']; 

asort($a1); 

Ключи a1 и a2 являются идентификаторами из базы данных.

a1 сортируется по значению. После сортировки, как мы можем использовать один и тот же порядок сортировки в a2?

Спасибо!

ответ

5

Я считаю, что это работает:

$a1 = array(1=>2000,65=>1354,103=>1787); 
$a2 = array(1=>'hello',65=>'hi',103=>'goodevening'); 

asort($a1); // sort $a1, maintaining array index 

// sort $a2 by key, using the order of $a1 
function my_uksort($a, $b) { 
    global $a1; 

    return $a1[$a] < $a1[$b] ? -1 : 1; 
} 
uksort($a2, 'my_uksort'); 

var_dump($a1); 
var_dump($a2); 
+0

Спасибо! Кажется, это отлично работает. Я предпочитаю использовать пользовательскую функцию сортировки с использованием foreach. – DADU

+0

Спасибо, это тоже помогло мне. – DanielOlivasJr

0

Возможно, вы захотите посмотреть на array_multisort(), если вы можете справиться с потерей ассоциации идентификаторов (массивы будут переиндексированы).

array_multisort($a1, $a2); 
+0

я могу» t обрабатывают потерю ассоциации ключей, так как это создает связь между двумя массивами. – DADU

+0

Отношение будет сохранено. Вопрос в том, что вы используете эти реальные (базы данных) идентификаторы где-то позже. Если они вам нужны, тогда нет возможности сделать это за один вызов (см. Http://php.net/manual/en/array.sorting.php). Просто используйте пользовательскую функцию сортировки пользователей, представленную в других ответах. –

0
foreach($a1 as $key => $value){ 
    //do something with $a2 
    echo $a2[$key]; 
} 
+0

Итак, нет способа сделать это со встроенной функцией PHP? – DADU

+0

@marbrun: вы можете использовать несколько встроенных функций PHP, чтобы заставить их работать. Я просто считаю, что это намного проще. AFAIK, нет ни одной функции, которая сделала бы это для вас и поддерживала бы ассоциации клавиш – munch

1

не оптимальна, может быть .. но это коротко:

$a1 = array(1=>2000,65=>1354,103=>1787); 
$a2 = array(1=>'hello',65=>'hi',103=>'goodevening'); 
asort($a1); 

foreach(array_keys($a1) as $i) $out[$i] = $a2[$i]; 

echo join("\n", $out); 

взгляд в uasort() также

Смежные вопросы