Недавно мне дали интервью, где задавали много вопросов, но был один вопрос, на который я не мог ответить, что было следующим:
Печать многомерного массива с использованием только одного цикла foreach
.
$cars = array ( array("Volvo",22,18), array("BMW",15,13), array("Saab",5,2), array("Land Rover",17,15) );
Интервьюер попросил меня напечатать вышеупомянутый массив, используя только один цикл foreach
. Может ли кто-нибудь дать мне ответ на это?
Для этого вы можете использовать рекурсивную функцию. Только один цикл foreach
вызывает рекурсивно.
$cars = array(array("Volvo",22,18),array("BMW",15,13),array("Saab",5,2),array("Land Rover",17,15)); function displayArr($arr) { foreach($arr as $key => $value) { if(is_array($value)) { displayArr($value); echo "<br>"; } else { echo $value . " . "; } } } displayArr($cars);
Ну вот
$cars = array ( array("Volvo",22,18), array("BMW",15,13),array("Saab",5,2), array("Land Rover",17,15) ); foreach($cars as $car) { print("Name: ".$car[0]."\n"); print("Number 1: ".$car[1]."\n"); print("Number 2: ".$car[2]."\n"); }
Очевидно, можно было бы сделать проверки, чтобы проверить, установлены ли другие ключи во внутренних массивах. Но, похоже, ваш массив всегда будет содержать все ключи.
РЕДАКТИРОВАТЬ:
На основании комментария, который вы оставили, вы хотите быть максимально динамичным, так что вам нужно использовать рекурсию или структуру управления goto.
$cars = array ( array("Volvo",22,18), array("BMW",15,13),array("Saab",5,2), array("Land Rover",17,15) ); foreach($cars as $car) { $count = 0; A: if(isset($car[$count])) { print($car[$count] . "\n"); $count +=1; goto A; } }
Вот метод, который не использует даже один цикл foreach
function walk2($item, $key) { echo $key . ' - ' . $item.PHP_EOL; } function walk1($car, $key) { array_walk($car, 'walk2'); echo '------'.PHP_EOL; } array_walk($cars, 'walk1');
Выдает вывод:
0 - Volvo 1 - 22 2 - 18 ------ 0 - BMW 1 - 15 2 - 13 ------ 0 - Saab 1 - 5 2 - 2 ------ 0 - Land Rover 1 - 17 2 - 15 ------
Хотя возможно, этот вопрос должен был заставить вас задавать логические вопросы о составе массива, чтобы они могли протестировать ваши аналитические навыки так же сильно, как и вашу способность прыгать через кодирующие обручи.
Кроме того, даже если вы не используете foreach или какой-либо другой цикл, вы используете код «C», который был написан для этих функций, который, конечно же, использует какой-то цикл.
Это может дать вам результат.
<?php $cars = array ( array("Volvo",22,18), array("BMW",15,13),array("Saab",5,2), array("Land Rover",17,15) ); array_map('fun', $cars); function fun($cars){ foreach($cars as $car){ echo $car."<br />"; } } ?>
вывод
Volvo 22 18 BMW 15 13 Saab 5 2 Land Rover 17 15
используйте array_map для перемещения по дочерним массивам.
foreach($cars as $key=>$car){ echo $car[0]; echo $car[1]; echo $car[2]; }
$cars = array ( array("Volvo",22,18), array("BMW",15,13), array("Saab",5,2), array("Land Rover",17,15) ); foreach($cars as $car){ echo "<pre>"; print_r($car); echo "</pre>"; }