Функция пользовательской сортировки PHP, основанная на вводе строки?

Скажем, у меня есть аранжировка:

$arr = array( 'Animal Dog', 'Subject Physics', 'Place Tokyo', 'Sport Tennis' ); 

Я хочу usort это со следующими критериями: если он содержит ранжирование tokyo первую очередь, если он содержит второй tennis , если он содержит третью dog .

 Place Tokyo, Sport Tennis, Animal Dog, Subject Physics 

Я знаю, что могу использовать stristr чтобы увидеть, существуют ли слова в $a и $b , но я не знаю, как писать условия 3 if …

 function cmp($a,$b){ if ( stristr($a,'tokyo') ) // return what? } usort($arr, "cmp") 

Как я могу написать функцию сравнения?

какой странный вопрос .. это делает то, что вы ищете?

 usort($arr, 'cmp'); function cmp($a, $b) { $av = (stripos($a, 'tokyo') !== false) * 4 | (stripos($a, 'tennis') !== false) * 2 | (stripos($a, 'dog') !== false); $bv = (stripos($b, 'tokyo') !== false) * 4 | (stripos($b, 'tennis') !== false) * 2 | (stripos($b, 'dog') !== false); return $av < $bv; } 

Попробуйте этот код.

 $arr = array( 'Animal Dog3', 'Animal Dog1', 'Animal Dog2', 'Subject Physics', 'Place1 Tokyo', 'Place4 Tokyo', 'Sport Tennis' ); $order_array = array('tokyo', 'tennis', 'dog'); $sort_function = function($a, $b) use($order_array) { $return = strcasecmp($a, $b); foreach ($order_array as $word) { // if each string contains `tokyo` -- alphabetical order if (stripos($a, $word) !== false && stripos($b, $word) !== false) { $return = strcasecmp($a, $b); break; } // if $a string contains `tokyo` -- $a goes first elseif (stripos($a, $word) !== false) { $return = -1; break; } // if $b string contains `tokyo` -- $b goes first elseif (stripos($b, $word) !== false) { $return = 1; break; } // if $a and $b does not contains -- lets take `tennis` else { continue; // just for readablity } } return $return; }; usort($arr, $sort_function); var_dump($arr); // ["Place1 Tokyo","Place4 Tokyo","Sport Tennis","Animal Dog1","Animal Dog2","Animal Dog3","Subject Physics"] 

Или этот

 $arr = array( 'Animal Dog3', 'Animal Dog1', 'Animal Dog2', 'Subject Physics', 'Place1 Tokyo', 'Place4 Tokyo', 'Sport Tennis' ); $order_array = array('tokyo', 'tennis', 'dog'); $sort_function = function($a, $b) use($order_array) { $a_index = sizeof($order_array); // lets suppose that it's last $b_index = sizeof($order_array); // lets suppose that it's last $i = 0; foreach ($order_array as $word) { if (stripos($a, $word) !== false) $a_index = $i; // remeber index order of $a if (stripos($b, $word) !== false) $b_index = $i; // remeber index order of $b $i++; } if ($a_index == $b_index) // if indexes are equal return strcasecmp($a, $b); // alphabetical order else return $a_index - $b_index; // index order }; usort($arr, $sort_function); var_dump($arr); // ["Place1 Tokyo","Place4 Tokyo","Sport Tennis","Animal Dog1","Animal Dog2","Animal Dog3","Subject Physics"]