2015-04-07 2 views
2

Я новичок в php и пытаюсь сортировать 2-й массив строк с определенным массивом порядка. Смотря на использование «usort» и «сравнение», но can not, кажется, обнимает их вокруг себя при использовании 2d массива и строк.PHP sort 2d строковый массив по определенному массиву порядка

Необходимо ввести массив в метод и вернуть отсортированный массив в том же формате. Поэтому для каждой записи в массиве она сортирует значение «файл» второго уровня, зависящее от порядка порядка массива. Любые предложения, как это сделать?

//actual array to be sorted by 'file' 
$Array ( 
[0] => Array ([source] => img/table/icon/toxic.svg [file] => toxic) 
[1] => Array ([source] => img/table/icon/health.svg [file] => health) 
[2] => Array ([source] => img/table/icon/irritant.svg [file] => irritant )); 

//order array with desired sort order 
$order = array("irritant","corrosive","environment" ,"health","toxic","oxidizing","flammable","explosive","gas"); 

//Desired Output Result 
$Array ( 
[0] => Array ([source] => img/table/icon/irritant.svg [file] => irritant) 
[1] => Array ([source] => img/table/icon/health.svg [file] => health) 
[2] => Array ([source] => img/table/icon/toxic.svg [file] => toxic)); 

См так раздражитель первой и токсичным является последним :)

ответ

0

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

<?php 
    $a[] = array('source' => 'img/table/icon/toxic.svg','file'=>'toxic'); 
    $a[] = array('source' => 'img/table/icon/health.svg','file'=>'health'); 
    $a[] = array('source' => 'img/table/icon/irritant.svg','file'=>'irritant'); 

    $b = array(); 

    $order = array("irritant","corrosive","environment","health","toxic","oxidizing","flammable","explosive","gas"); 

    foreach ($a as $arr) { 
     foreach ($order as $key => $o) { 
      if ($o == $arr['file']) { 
       $b[$key] = $arr; 
       break; 
      } 
     } 
    } 
    ksort($b); 
    print_r(array_values($b)); // or print_r($b); if you dont want sequential keys 
?> 

выход:

Array ( 
[0] => Array ([source] => img/table/icon/irritant.svg [file] => irritant) 
[1] => Array ([source] => img/table/icon/health.svg [file] => health) 
[2] => Array ([source] => img/table/icon/toxic.svg [file] => toxic) 
) 
+0

Спасибо, что работает с удовольствием .... выглядит просто, но wudve взял меня на то, чтобы выяснить, используя arrayflip и ksort. – Orbitall

+0

вам даже не понадобится 'array_flip' ... см. Мое последнее редактирование. Это можно сделать без этого. Я тоже рад помочь. Метод usort, предложенный xathien, также будет работать, но для новичков PHP он ничего не объясняет. – zgr024

1

Это может быть достигнуто за счет разумного использования РНР usort функция. Ваш звонок может выглядеть примерно так:

$order = array("irritant","corrosive","environment" ,"health","toxic","oxidizing","flammable","explosive","gas"); 
usort($array, function ($a, $b) use ($order) { 
    $aOrder = array_search($a['file'], $order); 
    $bOrder = array_search($b['file'], $order); 
    if ($aOrder == $bOrder) return 0; 
    return ($aOrder > $bOrder) ? 1 : -1; 
}); 
+0

Это гораздо эффективнее использовать? просто попробовал и получил пустой массив при печати результата ... probs jus me n my understanding tho. – Orbitall

+0

Это было бы заметно более эффективно на больших массивах, чем на необработанном PHP, поскольку 'usort()' делает это как на месте, так и с использованием C, делая его более доступным по времени и времени. – xathien

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