2014-08-27 3 views
0

Пример:PHP сортирует массив «как» другой массив. Как?

$a = [ 'b', 'd', 'a', 'e' ] 
$b = [ 'e', 'a', 'q', 'b' ] 

Я хочу

$b = [ 'b', 'a', 'e', 'q'] 

Мне нужно сортировать $b таким образом, чтобы каждый элемент уже присутствует в $a в том же порядке, элемент находится в $a.

Так 'b', 'a' и 'e' в $a поэтому они приходят, а затем новый 'q' является последним.

Я спрашиваю о функции, которую я не знаю, если она существует, или технике для ее выполнения.

+2

Этот вопрос не показывает никаких исследований. – Fabio

+0

Он спрашивает о http://php.net/manual/en/function.usort.php. –

+2

Как b, a, e, q тот же «порядок», что и b, d, a, e? Можете ли вы более четко определить правила для этого? – GolezTrol

ответ

2

Это должно работать до тех пор, пока каждый массив имеет разные значения и нет строковых ключей.

$b = array_merge(array_intersect($a, $b), array_diff($b, $a)); 

Это полагаться на незарегистрированном поведении array_diff.

+0

Хорошо, это хороший ответ. Мне действительно нужно сортировать ключи, но как только я получил правильный порядок клавиш, с двумя циклами я сохраняю каждое значение, привязанное к правильным клавишам. Спасибо, я попробую – realtebo

+0

Очень приятно найти, но как вы можете гарантировать, что это всегда будет работать? Я думаю, что в документации не указан порядок сортировки, и вы не хотите полагаться на некоторые недокументированные детали реализации. – GolezTrol

+1

@ GolezTrol Хорошая точка. Основываясь на том, что я видел в источнике PHP, он должен работать в условиях, о которых я говорил, но документация для трех функций, которые я использовал, не совсем ясна. Для 'array_intersect' он указывает, что ключи сохранены, а для' array_merge' говорится, что «Значения во входном массиве с числовыми ключами будут перенумерованы с добавочными ключами, начиная с нуля в массиве результатов». Но в документации 'array_diff' нет ничего, что ссылается на сохраняемые ключи или будет ли результат в каком-либо конкретном порядке. –

0

Если вы хотите очень длинный, громоздкий фрагмент кода, который делает то же самое, что и Не очень панический 's очень креативный oneliner, вы можете использовать мой. ;-)

Преимущество этого в том, что он не полагается на (в основном недокументированные) детали реализации таких функций, как array_diff. Кроме того, это дает вам хорошую возможность использовать закрытие, которое не имеет особого преимущества, кроме того, что оно довольно круто. Возможно, код может быть немного короче, но поэтапное решение должно быть, по крайней мере, относительно легко понятным.

<?php 
$a = [ 'b', 'd', 'a', 'e', 'x' ]; 
$b = [ 'e', 'a', 'q', 'b', 'g' ]; 

// Custom sorter functions like usort use a callback that compares items. 
// The compare function should return < 0 if the first item should come 
// before the second, > 0 if the second item should come first, or 0 
// if both items can be considered equal. 
$sortFunction = function($i1, $i2) use ($a, $b) 
{ 
    // Get the indexes of both item in array $a 
    $x1 = array_search($i1, $a); 
    $x2 = array_search($i2, $a); 
    // If both indexes are assigned, compare them. 
    if ($x1 !== false && $x2 !== false) 
    return $x1 - $x2; 
    // Only the first item exists, so that one is 'smaller' (should come before the other) 
    if ($x1 !== false) 
    return -1; 
    // Only the second item exists, so that one is 'smaller' 
    if ($x2 !== false) 
    return 1; 
    // Neither exist. Keep the original order as they were in $b. 
    return array_search($i1, $b) - array_search($i2, $b); 
}; 

$c = $b; 
usort($c, $sortFunction); 
Смежные вопросы