Важной частью этого является написание функции доступа, которая берет одну строку из ваших данных вместе с «путем» в точечной нотации, например, rating.top
.
$accessor = function($row, $path) {
$steps = explode('.', $path);
$return = $row[array_shift($steps)];
while ($level = array_shift($steps)) {
$return =& $return[$level];
}
return $return;
};
Это итерация глубже в массиве с каждым шагом пути и преобразование в значение в конце. Это будет работать на произвольное количество шагов, например, user.rating.top.foo.var.whatever
. По сути, это очень урезанная версия компонента Symfony PropertyAccess .
Используя это, вы можете создать обратный вызов для передачи на usort
, который будет сравнивать доступные значения из двух сравниваемых элементов.
usort($array, function ($a, $b) use ($field, $accessor) {
$aVal = $accessor($a, $field);
$bVal = $accessor($b, $field);
return $aVal <=> $bVal;
});
Вы можете увидеть полностью рабочую версию здесь: https://3v4l.org/UciGc