0

TL;DR: 特定の単語の配列を並べ替える必要があります。順序は既存の配列と一致する必要があります。最後のコード ブロックのサンプル コードを参照してください。

タイトルの配列があります。各タイトルの最初の単語は色です。この時点で配列の並べ替えには慣れていますが、これは混乱を招きます。

問題:既に並べ替えられた単語のリストに基づいて、単語の配列を手動で並べ替える必要があります。uasort次の 2 つの変数を比較できるように設定しました。

// first comparison:
$a_first = strtolower( $a_split[0] ); // white
$b_first = strtolower( $b_split[0] ); // blue

// 2nd comparison:
$a_first = strtolower( $a_split[0] ); // purple
$b_first = strtolower( $b_split[0] ); // white

// 3rd comparison:
$a_first = strtolower( $a_split[0] ); // blue
$b_first = strtolower( $b_split[0] ); // purple

柔術のランク付けシステムのために、これらの色をベルトのランク付けで分類する必要があります。正しい順序の配列は次のとおりです。

$color_order = explode(' ', 'white blue purple brown black black-red coral white-red red');

/* $color_order =
Array (
  [0] => white
  [1] => blue
  [2] => purple
  [3] => brown
  [4] => black
  [5] => black-red
  [6] => coral
  [7] => white-red
  [8] => red
) 

Current (incorrect) results:
1. Blue
2. Purple
3. White

Desired results:
1. White
2. Blue
3. Purple
*/

uasort() から出てくる私の現在のコードは、strcmp でアルファベット順にソートされています。strcmp を、カラー配列を使用してソートできるものに置き換える必要があります。(ちなみに、色は単語と一致しません。色は別の配列に移動されるため、ここでエラーをチェックする必要はありません)。

// Sort Step 1: Sort belt level by color
// $video_categories[belt_id][term]->name = "White belt example"

function _sort_belt_names( $a, $b ) {
  $a_name = trim( $a['term']->name );
  $b_name = trim( $b['term']->name );

  $a_split = explode( ' ', $a_name );
  $b_split = explode( ' ', $b_name );

  if ( $a_split && $b_split ) {
    $color_order = explode(' ', 'white blue purple brown black black-red coral white-red red');

// IMPORTANT STUFF BELOW! ----
    $a_first = strtolower( $a_split[0] ); // purple
    $b_first = strtolower( $b_split[0] ); // white

    // Compare $a_first $b_first against $color_order
    // White should come first, red should come last
    // Return -1 (early), 0 (equal), or 1 (later)
// IMPORTANT STUFF ABOVE! ----
  }

  // If explode fails, sort original names alphabetically.
  return strcmp( $a_name, $b_name );
}

// ---

uasort( $video_categories, '_sort_belt_names' );
4

4 に答える 4

1
<?php
 function _sort_belt_names( $a, $b ) {

  $a_split = explode( ' ', $a );
  $b_split = explode( ' ', $b );

  if ( $a_split && $b_split ) {
    $color_order = explode(' ', 'white blue purple brown black black-red coral white-red red');

// IMPORTANT STUFF BELOW! ----
    // Convert all the elements in $a_split and $b_split to lowercase

    foreach ( $color_order as $key => $value) {
        if ( in_array($value , $a_split) || in_array($value, $b_split)) {
           $sorted[] = $value;
        }

    }
    var_dump($sorted);
// IMPORTANT STUFF ABOVE! ----
  }

  // If explode fails, sort original names alphabetically.
  // Do whatever you whant to do if explode fails
}

$a = "black white coral blue";
$b = "black-red purple";
_sort_belt_names($a, $b);
?>

$ php sorting.php
array(6) {
  [0]=>
  string(5) "white"
  [1]=>
  string(4) "blue"
  [2]=>
  string(6) "purple"
  [3]=>
  string(5) "black"
  [4]=>
  string(9) "black-red"
  [5]=>
  string(5) "coral"
}
于 2013-07-22T23:35:36.857 に答える
1

uasort がこれに適しているかどうかはわかりません。入力配列を色の配列 (反転) に対してチェックし、反転した値 (以前は数値キー) をキーとする配列にそれらを追加して並べ替えます。

// Sort Step 1: setup color sort array(s)
$color_order = explode(' ', strtolower('white blue purple brown black black-red coral white-red red'));
$color_keyed = array_flip($color_order);

// Sort Step 2: Sort belt level by color
// $video_categories[belt_id][term]->name = "White belt example"

$unmatched=array();
$categorised=array();
$catsorted=array();
foreach($video_categories as $a) {

  $a_names = explode(' ',strtolower(trim( $a['term']->name)));
  $a_name=$a_names[0];
  // check if $a_name is a value in $color_order or a key in $color_keyed
  if (!array_key_exists("$a_name",$color_keyed) {
    $unmatched[]=$a;
  } else {
    // separated these 2 commands to make more readable but could have done:
    // $categorised[$color_keyed["$a_name"]][]=$a;
    // Putting the video_categories item into an array ordered by the key value of the matching color.
    $catkey=$color_keyed["$a_name"];
    $categorised[$catkey][]=$a;
  }
}

// You can now run a double foreach over the 2 dimensional $categorised array 
// to pick out the ordered video_categories entries:
// then write them to a single dimensional array
foreach ($categorised as $colkey=>$catkeyed)
{
  foreach ($catkeyed as $cat) {
  $catsorted[]=$cat;  
}
// ---
// $catsorted should now be a flat array 
// containing the original $video_categories array entries
// sorted by the order of the grade colors above

これでうまくいくはずです。

于 2013-07-22T23:58:12.467 に答える
1

配列の例を見ないと、コード化するのはちょっと難しいですが、次のようなものがうまくいくはずです:

usort($arr, function ($a, $b){
    $ord =array_flip(array ('white', 'blue', 'purple', 'brown', 'black', 'black-red', 'coral', 'white-red', 'red'));
    return $ord[$b] - $ord[$a];
});
于 2013-07-22T23:21:11.473 に答える