Как пройтись по всем элементам многомерного массива без использования рекурсивных функций в пхп?

php массивы

Хотелось бы просто пройтись циклом по массиву, без использования каких-либо функций, типа array_walk или рекурсий. Подскажите красивое, быстрое решение. (заранее вложенность элементов массива неизвестна)

Примечание:
мысли есть, нужно будет создать временный массив, может кто-нибудь знает более красивое решение

Примечание:
Dr. von Ozgg
рекурсия медленная

Примечание:
Dr. von Ozgg
да и просто интересно как это сделать

Примечание:
Безруков Павел
хотелось бы вообще без каких-либо функций, ну очень хочется

Примечание:
в общем вся идея в том, чтобы одна и та же функция не вызывалось много раз, классно же

Примечание:
Безруков Павел
Потому что это годится только для двумерного массива, а я хочу для любого многомерного, при чём заранее неизвестно какой уровень вложенности, т.е. может быть $myarray[$i][$j][$k][$m]

Примечание:
я уже почти придумал, мысль ходит где-то рядом

Примечание:
В общем я тут что-то написал, вроде работает

пусть $a - это какой-нибудь многомерный массив

$flag = true;
$i = 0;
while ($flag == true)
{
$flag = false;
foreach ($a as $key=>$value)
{
if (is_array($value))
{
$flag = true;
$tmp_arr[] = $value;
}
echo 'key '.$key.', value '.$value.'<br/>';
}
if (isset($tmp_arr[$i]))
{
$a = $tmp_arr[$i++];
}
}

здесь перебор всех элементов массива, только echo коряво сделал, если $value - массив, то он так и пишет Array, но суть не в этом, главное каждый элемент перебирает, наверняка быстрее рекурсивных функций

Примечание:
табуляция не проставилась, исправляюсь

$flag = true;
$i = 0;
while ($flag == true)
{
$flag = false;
foreach ($a as $key=>$value)
{
if (is_array($value))
{
$flag = true;
$tmp_arr[] = $value;
}
echo 'key '.$key.', value '.$value.'<br/>';
}
if (isset($tmp_arr[$i]))
{
$a = $tmp_arr[$i++];
}
}

Примечание:
crimaniak
я думаю мой вариант будет работать быстрее
Ответы:
А чем рекурсия не устраивает. Если без неё и можно обойтись, то это будет выглядеть чудовищно и скорее всего тормозить будет.
Ещё есть функция array_map($callback, $arr1 [, ...]);
Но я не знаю как она устроенна, может рекурсивная, может нет! :)
>хотелось бы вообще без каких-либо функций, ну очень хочется
Потому что это годится только для двумерного массива, а я хочу для любого многомерного, при чём заранее неизвестно какой уровень вложенности, т.е. может быть $myarray[$i][$j][$k][$m]
Любая рекурсия раскладывается в цикл, но тебе при этом потребуется дополнительный стек. Могу написать примерный код, но не буду, так как сама постановка вопроса дурацкая. array_walk_recursive() заведомо быстрее реализованного любым образом аналога на PHP. Таким образом, самое красивое и быстрое решение - использовать array_walk_recursive().


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.