7

PHP で文字列を並べ替えたいのですが、最初に部分文字列の最初の文字を照合し、次に文字列全体の文字を照合する必要があります。

たとえば、誰かが を検索doし、リストに次のものが含まれているとします。

Adolf
Doe
Done

結果は

Doe
Done
Adolf

レギュラーsort($array, SORT_STRING)とかそういうのじゃダメなのか、アドルフが先に並びます。

誰かがそれを行う方法を知っていますか?

4

3 に答える 3

3

usort(array, callback)コールバックに基づいてソートできます。

例(このようなもの、試していません)

usort($list, function($a, $b) {
   $posa = strpos(tolower($a), 'do');
   $posb = strpos(tolower($b), 'do');
   if($posa != 0 && $posb != 0)return strcmp($a, $b);
   if($posa == 0 && $posb == 0)return strcmp($a, $b);
   if($posa == 0 && $posb != 0)return -1;
   if($posa != 0 && $posb == 0)return 1;
});
于 2012-08-16T12:37:35.707 に答える
3

カスタムソートを使用します:

<?php
$list = ['Adolf', 'Doe', 'Done'];

function searchFunc($needle)
{
  return function ($a, $b) use ($needle)
  { 
    $a_pos = stripos($a, $needle);
    $b_pos = stripos($b, $needle);

    # if needle is found in only one of the two strings, sort by that one
    if ($a_pos === false && $b_pos !== false) return 1;
    if ($a_pos !== false && $b_pos === false) return -1;

    # if the positions differ, sort by the first one
    $diff = $a_pos - $b_pos;
    # alternatively: $diff = ($b_pos === 0) - ($a_pos === 0) 
    if ($diff) return $diff;

    # else sort by natural case
    return strcasecmp($a, $b);

  };
}

usort($list, searchFunc('do'));

var_dump($list);

出力:

array(3) {
  [0] =>
  string(3) "Doe"
  [1] =>
  string(4) "Done"
  [2] =>
  string(5) "Adolf"
}
于 2012-08-16T12:50:55.447 に答える
0

に基づいて文字列を並べ替えてstripos($str, $search)、先頭 ( stripos() == 0) の文字列が最初に表示されるようにすることができます。

次のコードは、検索文字列の部分文字列の位置を別の配列にプッシュし、 を使用array_multisort()して一致に適切な順序を適用します。何度もusort()呼び出す必要を避けるのではなく、この方法で実行します。stripos()

$k = array_map(function($v) use ($search) {
    return stripos($v, $search);
}, $matches);

// $k contains all the substring positions of the search string for all matches

array_multisort($k, SORT_NUMERIC, $matches, SORT_STRING);

// $matches is now sorted against the position
于 2012-08-16T12:36:31.033 に答える