-1

PHP に問題があります。キーに従って配列の値のインデックスを再作成し、各配列を同じ順序にして簡単に比較できるようにしたい (重複を削除するため)。配列の長さは重複を削除します。

たとえば、 A,C,B,D / D,B,C,A / C,A,B,D はすべて、値 A,B,C,D を持つように並べ替える必要があります。 0->A、1->B、2->C、3->D

たとえば、この配列があるとしましょう

Array(
  [0] => Array (
    [0] => S,
    [1] => E,
    [2] => Q,
    [3] => A
  )
) 

そして、インデックスを持つ文字の特定のリストがあります(インデックスを持つ文字):

// index --> character ( array with real indexes)
$array_real_index = Array(
  [0] => A, 
  [1] => C, 
  [2] => D, 
  [3] => B, 
  [4] => E, 
  [5] => Q, 
  [6] => R,
  [7] => S
)

文字が見つかった場合、インデックスを (正しいものでない場合) 正しいものに置き換える必要があります。

したがって、結果は次のようになります。

Array (
  [0] => A, 
  [1] => E, 
  [2] => Q, 
  [3] => S
) 

今後ともよろしくお願いいたします。

4

3 に答える 3

0
$original_array = Array(
    0 => 'S',
    1 => 'E',
    2 => 'Q',
    3 => 'A'
);
$array_real_index = Array(
  0 => 'A', 
  1 => 'C', 
  2 => 'D', 
  3 => 'B', 
  4 => 'E', 
  5 => 'Q', 
  6 => 'R',
  7 => 'S'
);

// Custom sorting function passed to usort. $a & $b are two values
// being compared in terms of how they should be sorted. Results:
// 1:  $a > $b  (move $b down one and $a up one)
// -1: $b > $a  (move $a down one and $b up one)
// 0:  $a == $b (no change)
function sort_using_real_index($a,$b){
  // allow access to $array_real_index from within this function
  global $array_real_index;

  // retrieve the key indexes of the values. E.g. $a might contain
  // 'R', array_search would return 6. 
  $aI = array_search($a, $array_real_index);
  $bI = array_search($b, $array_real_index);

  // Both the found keys are then compared and returned
  // (1, -1 and 0 results reflect how $a and $b relate in terms
  // of sort order within the sorted result)
  return $aI == $bI
    ? 0
    : ($aI > $bI ? 1 : -1);
}

// dump out the original array (benchmark)
var_dump($original_array);

// sort the original array using the custom function
usort($original_array, 'sort_using_real_index');

// output the sorted result
var_dump($original_array);

他の人が言ったように、usort1 つの配列のキーを並べ替え関数の比較子として使用するカスタム関数を使用して渡すことができます。

usort最も有用なメトリックを使用して配列をソートする方法を示すために使用したかった.

于 2013-03-11T15:54:08.173 に答える
0

これを試して:

<?
  $sorted_array = array_intersect($sort_array, $array_real_index);
  sort($sorted_array);
  print_r($sorted_array);
?>
于 2013-03-11T15:44:03.290 に答える
0
  1. カスタムソートとは、usort()一連の関数の 1 つを意味します。
  2. カスタムフィルターとはarray_filter().

コード:

$master = array('A', 'C', 'D', 'B', 'E', 'Q', 'R', 'S');

function myCompare($a, $b) {
  global $master;
  $index_a = array_search($a, $master, TRUE);
  $index_b = array_search($b, $master, TRUE);
  if( $index_a === false && $index_b === false ) {
    // if neither are in the array, then sort by their normal value
    return ($a === $b) ? 0 : ($a < $b) ? -1 : 1;
  } else if( $index_a === false ) {
    // if only one is in the array, then it is "greater" than the other
    return 1;
  } else if( $index_b === false ) {
    return -1;
  } else {
    // otherwise the item with the lowest index is the "greater" of the two
    return ($index_a === $index_b) ? 0 : ($index_a < $index_b) ? -1 : 1;
  }
}

function myFilter($var) {
  global $master;
  return in_array($var, $master);
}

$input = array('A','B','C','D','E','F','G','H');
$input = array_filter($input, 'myFilter');
usort($input, 'myCompare');
print_r($input);

/* Output:
Array
(
    [0] => A
    [1] => C
    [2] => D
    [3] => B
    [4] => E
) */
于 2013-03-11T16:07:07.700 に答える