2012-06-02 2 views
5

Я пытаюсь понять, как написать функцию тай-брейка. Следующие записи связаны по той или иной причине, поэтому, чтобы разбить галстук, мы сортируем каждый результат, а затем просматриваем каждую строку. Галстук сломан в первой точке, есть разница.Сравнение нескольких массивов

В приведенном ниже примере на первом проходе $ result [c] устраняется, но a и b все еще связаны. Затем на втором проходе а устраняется, потому что он больше, чем b. Таким образом, результат Ь, а, с

$result[a] = array(1, 3, 4, 5); 
$result[b] = array(1, 2, 3, 7); 
$result[c] = array(2, 3, 3, 5); 

И чтобы сделать его еще более сложным, я не всегда будет иметь такое же количество результатов для сравнения. Это может быть что-то большее, чем 2.

Я действительно надеюсь, что это имеет смысл.

+0

Я добавил ответ, что это 100% функциональный и производит правильный вывод. Это будет работать даже для произвольного количества конкурентов. – nickb

ответ

3

В PHP, вы можете сравнить массивы непосредственно с помощью операторов Relation

if ($result['a'] > $result['b']) { 

} 

PHP будет только через цикл подразделам массивов, сравнивая их элементы. Если вы хотите прочитать http://php.net/manual/en/language.operators.comparison.php

В любом случае, вы можете воспользоваться этим и просто отсортировать его.

asort($result); 
print_r($result); 

Если вам нужен способ, чтобы получить запись n-й место, сделать

asort($result); 
print_r($result); 
$ranked = array_keys($result); 
$secondPlace = $ranked[1]; // a 
print_r($result[$secondPlace]); 

и если вам нужен ранг Indice письма

$letterRanks = array_flip($ranked); 
echo $letterRanks['a']; // 1, for second 
+0

Это прибило его. Как только у меня будут отсортированы массивы результатов, которые я должен был выполнить в любом случае, функция asort сделала именно то, что мне нужно с одной строкой кода. – Mcg1978

0
$i = 0; 
while (count($result) > 1) { 
    $winners = array(); 
    $best = PHP_INT_MAX; 
    foreach ($result as $x) { 
     if ($x[$i] == $best) { 
     $winners[] = $x; 
     } else if ($x[$i] < $best) { 
     $winners = array($x); 
     $best = $x[$i]; 
     } 
    } 
    $i++; 
    $result = $winners; 
} 

Это просто быстрый и грязный кусок кода ... он не справляется с ситуацией, когда массивы разных размеров. В основном потому, что я не уверен, какой из массивов (1,2,3) или массив (1,2) должен «выиграть». Кроме того, он не проверяет границы массива или не обрабатывает ситуацию, когда более одного массива привязаны после сравнения всех элементов.

+0

Спасибо за ответ Боб. К счастью, массивы всегда будут одного размера. Но ваш пример сбрасывает массив $ result после каждой итерации, неужели это не сработает? О, и если они все еще связаны после этого процесса, он переходит к другому процессу, поэтому нам просто нужно знать, не удалось ли разрешить связи. – Mcg1978

0

Вот рабочий решение. Дайте мне знать, если вам нужно лучшее объяснение того, как это работает. Я оставил отладочные заявления, чтобы вы могли различить, что он делает. Это решение будет работать с любым количеством конкурентов, если каждый из них имеет одинаковые $num_elements в каждом массиве.

$result = array(); 
$result['a'] = array(1, 3, 4, 5); 
$result['b'] = array(1, 2, 3, 7); 
$result['c'] = array(2, 3, 3, 5); 

$num_elements = 4; // In each array 
$num_competitors = count($result); 

$finish_order = array(); 
$keys = $winners = array_keys($result); 

// $i is the current index into each competitor's array 
// $j is the current index into the $keys array (telling us the current competitor) 
// $k is the next index into the $keys array (telling us the next competitor, i.e. the competitor to compare the current competitor with) 
for($i = 0; $i < $num_elements; $i++) { 

    // If we've eliminated all but one winner, we're done! 
    if(count($winners) == 1) { 
     $finish_order[] = array_pop($winners); 
     break; 
    } 

    echo 'Element number ' . $i . "\n"; 

    for($j = 0; $j < $num_competitors; $j++) { 

     // If we've already eliminated this competitor, continue; 
     if(!isset($winners[$j])) continue; 

     for($k = $j + 1; $k < $num_competitors; $k++) { 

      // If we've already eliminated this competitor, continue; 
      if(!isset($winners[$k])) continue; 

      echo "\t - Who wins: " . $result[ $keys[$j] ][$i] . ' from ' . $keys[$j] . ' or ' . $result[ $keys[$k] ][$i] . ' from ' . $keys[$k] . "?\n"; 

      if($result[ $keys[$j] ][$i] < $result[ $keys[$k] ][$i]) { 

       echo "\t\t *** " . $keys[$k] . ' is out!' . "\n"; 
       $finish_order[] = $keys[$k];     
       unset($winners[$k]); 
      } 

      if($result[ $keys[$j] ][$i] > $result[ $keys[$k] ][$i]) { 

       echo "\t\t *** " . $keys[$j] . ' is out!' . "\n"; 
       $finish_order[] = $keys[$j];     
       unset($winners[$j]); 
      } 

     } 
    } 
} 

echo "Game over - Result order is: " . implode(', ', array_reverse($finish_order)); 

Выход:

Element number 0 
    - Who wins: 1 from a or 1 from b? 
    - Who wins: 1 from a or 2 from c? 
     *** c is out! 
Element number 1 
    - Who wins: 3 from a or 2 from b? 
     *** a is out! 
Game over - Result order is: b, a, c 

Demo

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