2016-10-25 3 views
1

У меня есть разделенные запятые строки/массив:Заказать массив на основе другого массива

$input = "facebook,steam,tumblr,email,instagram,twitter,twitch,youtube,pinterest,amazon,disqus"; 
$input = explode(",", $input); 

, что я хочу быть заказан на основе другого массива:

$order = "email,facebook,instagram,twitter,twitch,youtube,steam,pinterest,tumblr,amazon,disqus"; 
$order = explode(",", $order); 

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

Например, ввод twitter,twitch,email,facebook вернется email,facebook,twitter,twitch


Я уже нашел This Solution но это не относится, потому что я не имею дела с ключами в моем массиве.

ответ

4

Не нужно делать какие-либо причудливые алгоритмы сортировки. Вы можете просто сделать:

array_intersect($order, $input);

Это возвращает массив, содержащий все значения $order, которые присутствуют $input. И, к счастью, эта функция сохраняет первоначальный заказ в $order.

Примечание: порядок аргументов array_intersect() важен. Убедитесь, что вы сначала передаете $order, так как это ваш ссылочный массив, затем перейдите в $input, как в приведенном выше примере. В противном случае это сделает наоборот, чего вы не хотите.

Подробнее: http://php.net/manual/en/function.array-intersect.php

0

Я не проверял, но может быть полезно

function orderByOtherArray($input, $orderedArray){ 
     $orderedInput = array(); 
     foreach($orderedArray as $key => $value){ 
      if(in_array($value, $input)){ 
       $orderedInput[] = $value; 
       if(($key = array_search($value, $input)) !== false) { 
        unset($input[$key]); 
       } 
      } 
     } 

     foreach($input as $key => $value){ 
      $orderedInput[] = $value; 
     } 

     return $orderedInput; 
    } 
+0

array_intersect() чистой, за исключением пересечений элемента массива. –

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