Скрипт вывода данных из массива

$cars = [
    ['name' => 'Такси 1', 'position' => rand(0, 1000), 'isFree' => (bool) rand(0, 1)],
    ['name' => 'Такси 2', 'position' => rand(0, 1000), 'isFree' => (bool) rand(0, 1)],
    ['name' => 'Такси 3', 'position' => rand(0, 1000), 'isFree' => (bool) rand(0, 1)],
    ['name' => 'Такси 4', 'position' => rand(0, 1000), 'isFree' => (bool) rand(0, 1)],
    ['name' => 'Такси 5', 'position' => rand(0, 1000), 'isFree' => (bool) rand(0, 1)],
];

name - название машины, position - ее положение, isFree - признак свободна или занята.

Должен определить самое ближайшее и свободное такси до пассажира, который хочет куда-то поехать.

Положение пассажира также случайная величина, он может стоять в любой точке: $passenger = rand(0, 1000);

Напишите скрипт, который для каждого такси будет выводить строку, вида:
<Название машины>, строит на <км, где стоит машина> км, до пассажира <км до пассажира> км (<занят/свободен>)</ - едет это такси>

Например:
"Такси 1, стоит на 15 км, до пассажира 3 км (занят)"
"Такси 2, стоит на 0 км, до пассажира 12 км (свободен) - едет это такси"
"Такси 3, стоит на 300 км, до пассажира 288 км (свободен)"

Нельзя создавать свои функции
Данные и структуру массива менять запрещено.

Трудность вызвало "Должен определить самое ближайшее и свободное такси до пассажира, который хочет куда-то поехать." Ниже код который у меня получился:

    foreach ($cars as $k => $car) {
        echo $car['name'].", стоит на ".$car['position']." км, до пассажира ".(abs ($car['position'] - $passenger))." км ";
        if ($car['isFree'] == true) {
            echo "(свободен)";
        if ($car['name'] == $cars[$k]['name'] && $car['isFree'] == true) {
            echo " - едет это такси";
        }
        }
        else {
            echo "(занят)";
        }
        echo PHP_EOL;
    }

Но оно не определяет ближайшее и свободное такси. Либо все разом пишет, либо через раз срабатывает(Я пробовал разные вариации, не понимаю как сделать без функции).


Ответы (1 шт):

Автор решения: Flokker

Все заработало когда я написал вот так:

foreach($cars as $car) {
    $position = abs($car['position'] - $passenger);
    if ($car['isFree'] && (!isset($minPosition) || $position < $minPosition)) {
        $minPosition = $position;
        $name = $car['name'];
    }
}

foreach($cars as $car) {
    echo $car['name'] . " стоит на " . $car['position'] . " км, до пассажира " . abs($car['position'] - $passenger)." км (" . ($car['isFree'] ? "свободен" : "занят") . ")" . ($car['name'] == $name ? " - едет это такси" : "") . "<br>";
}
→ Ссылка