Функция использует array_multisort, но не знает, как указать ключ

здесь я довольно новичок в PHP, но не могу найти информацию, чтобы помочь мне в этом

По сути, я пишу функцию, позволяющую в один день собирать данные о гонках для лошадей из базы данных MySQL и заказывать их. Таким образом, я использую 3 значения — racedate, racevenue и sectional. В разрезе я могу указать, хочу ли я их последние 200 м, последние 400 м или около того.

Я запускаю запрос и затем помещаю результат в массив. Затем я хочу отсортировать этот массив по значению $ sectional.

Моя проблема заключается в создании массива $ times для использования array_multisort. Единственный способ заставить его работать — это жестко закодировать time200, чтобы указать, что нужно сортировать. Я действительно хочу иметь возможность сортировки по переменной $ sectional, поэтому я могу использовать эту функцию для любого типа имени столбца, передаваемого в $ sectional (т.е. time200, time400, time600 и т. Д.).

Помещение $ sectional вместо time200 не работает (что очевидно для тех, кто знает больше о том, что вы делаете), но я не могу понять, почему.

Спасибо за любую помощь!

  function sectionalrank($racedate, $racevenue, $sectional) {
global $connection;

$query   = "SELECT horsename, $sectional ";
$query  .= "FROM runs ";
$query  .= "WHERE racedate = '$racedate' ";
$query  .= "AND venue = '$racevenue' ";
$query  .= "AND $sectional > 0";

$result = mysqli_query($connection, $query);

$array = array();
while($row = mysqli_fetch_assoc($result)) {
$array[] = $row;
}

$times = array();
foreach ($array as $a) {
$times[] = $a['time200'];
}

array_multisort($times, SORT_ASC, $array);

return $array;

}

1

Решение

Ваш подход кажется хорошим. Меня устраивает.

function sectionalrank( $racedate, $racevenue, $sectional )
{
// simulate database query
$racedata[] = array('horsename' => 67, 'time200' => 2, 'time400' => 8);
$racedata[] = array('horsename' => 86, 'time200' => 1, 'time400' => 3);
$racedata[] = array('horsename' => 85, 'time200' => 6, 'time400' => 9);
$racedata[] = array('horsename' => 98, 'time200' => 2, 'time400' => 1);
$racedata[] = array('horsename' => 86, 'time200' => 6, 'time400' => 6);
$racedata[] = array('horsename' => 67, 'time200' => 7, 'time400' => 4);

$array = array();
foreach ($racedata as $row)
{
$array[] = $row;
}

$times = array();
foreach ($array as $a)
{
$times[] = $a[$sectional];
}

array_multisort($times, SORT_ASC, $array);
return $array;
}

// Using $racedata to pass in the data.
echo json_encode( sectionalrank( 'racedate', 'racevenue', 'time200' ) ) . "\n";
echo json_encode( sectionalrank( 'racedate', 'racevenue', 'time400' ) ) . "\n";

Output:
[{"horsename":86,"time200":1,"time400":3},{"horsename":67,"time200":2,"time400":8},{"horsename":98,"time200":2,"time400":1},{"horsename":85,"time200":6,"time400":9},{"horsename":86,"time200":6,"time400":6},{"horsename":67,"time200":7,"time400":4}]
[{"horsename":98,"time200":2,"time400":1},{"horsename":86,"time200":1,"time400":3},{"horsename":67,"time200":7,"time400":4},{"horsename":86,"time200":6,"time400":6},{"horsename":67,"time200":2,"time400":8},{"horsename":85,"time200":6,"time400":9}]
0

Другие решения

Других решений пока нет …