2014-10-30 4 views
0

У меня есть два массива разной длины:PHP: Сортировка массив в соответствии с другим массивом разной длиной

$paths_table = array("TS-0007_a.jpg", "TS-0040_a.JPG", "TS-0040_b.JPG", "TS-0040_f.JPG", "TS-0041_a.JPG", "TS-0041_b.JPG"); 

$order_table = array("TS-0040","TS-0007","TS-0041"); 

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

$final_table = array("TS-0040_a.JPG", "TS-0040_b.JPG", "TS-0040_f.JPG", "TS-0007_a.jpg", TS-0041_a.JPG", "TS-0041_b.JPG") 

если предположить, что я собираюсь использовать

strpos($paths_table[$i], $order_table[$j]); 

, чтобы проверить, если строка $ order_table является ВКЛЮЧАЕТ ed в любом из $ paths_table.

Как это сделать?

ответ

0

Обрабатывают массив так, что каждый элемент содержит указатель на префикс (то есть, превратить 'TS-0007_a.jpg' в [1,'TS-0007_a.jpg']):

foreach($paths_table as &$v) { 
    foreach($order_table as $n => $o) 
     if(strpos($v, $o) === 0) { 
      $v = [$n, $v]; 
      break; 
     } 
} 

сортировки массива:

sort($paths_table); 

и удалить индексы:

foreach($paths_table as &$v) 
    $v = $v[1]; 
0

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

$paths_table = array("TS-0007_a.jpg", "TS-0040_a.JPG", "TS-0040_b.JPG", "TS-0040_f.JPG", "TS-0041_a.JPG", "TS-0041_b.JPG"); 
$order_table = array("TS-0040","TS-0007","TS-0041"); 

$sorter = new PrefixSorter($order_table); 
$output = usort($paths_table, array($sorter, 'sort')); 

var_dump($paths_table); 

class PrefixSorter { 
    private $prefixes; 

    function __construct($prefixes) { 
     $this->prefixes = $prefixes; 
    } 

    function sort($path1, $path2) { 
     $prefix1 = -1; 
     $prefix2 = -1; 
     foreach($this->prefixes as $index=>$prefix) { 
      if (substr($path1, 0, strlen($prefix)) == $prefix) $prefix1 = $index; 
      if (substr($path2, 0, strlen($prefix)) == $prefix) $prefix2 = $index; 
     } 

     if (($prefix1 == -1 && $prefix2 == -1) || $prefix1 == $prefix2) { 
      return 0; 
     } 
     else if ($prefix1 == -1 || $prefix1 > $prefix2) { 
      return 1; 
     } 
     else if ($prefix2 == -1 || $prefix1 < $prefix2) { 
      return -1; 
     } 
    } 
} 

Я сделал несколько предположений:

  1. Вы хотите отсортировать по префиксов, указанных в order_table
  2. префиксов не дали ставятся на задней неупорядоченной.

Вы можете с курсом изменить код в соответствии с струнным сдерживанием вместо префиксов

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