Перебор элементов двумерного массива

alxander

Новичок
Перебор элементов двумерного массива

На входе: [1|2][1|2] (вообще, могут быть произвольные наборы)

Преобразуем в массив:
$arr = array(0 => array('1','2'), 1 => array('1','2'));

В данном случае элементами массива $arr являются вложенные массивы (наборы элементов, которые нужно перебрать)
Вывод нужен такой:
11
12
21
22

Буду благодарен за любую помощь в решении задачи.
 

alxander

Новичок
Извиняюсь, в самом начале сообщения сделал ошибку (На вЫходе: [1|2][1|2], а надо: На входе: [1|2][1|2])
Не понятно, как перебирать в нужном порядке элементы, сам же перевод в двумерный массив уже реализован.
 

SiMM

Новичок
А как Вы их перебирали, когда написали, какой должен быть вывод? Вот и действуйте по алгоритму.
 

Leonid

PHP? нет, не слышал...
может я чего не понимаю, но
foreach ($arr as $level1)
{
foreach ($level1 as $level2)
{
echo $level2;
}
echo '<br>';
}
}
 

Arqin

Новичок
Может сам перевод в двумерный массив реализован концептуально неверно?
Leonid, приведенный пример вывода пройдется именно по ключам 0 и 1 и никак более, т.е. сначала он возьмет массив из ключа 0 и выведет все его элементы, потом массив из ключа 1 и выведет все его элементы, а как я понял, автору необходимо вывод типа:
PHP:
$arr[0][0].$arr[1][0];
$arr[0][0].$arr[1][1];
$arr[0][1].$arr[1][0];
$arr[0][1].$arr[1][1];
 

alxander

Новичок
Arqin
Вы правы, однако все было бы просто, если бы не входные данные. А они в моей задаче меняются - могут быть и [1|2][1|2], и [1|2|3][1|2|3], и даже [1|2| ][1|2|3][1|2]. На количество наборов и кол-во элементов в них ограничений нет.
 

x-yuri

Новичок
PHP:
$a = explode( '][', substr($s, 1, strlen($s)-2) );
$r = array();
foreach( $a as $v )
    $r[] = explode('|', $v);
?
 

Arqin

Новичок
alxander
если массив всего лишь двумерный, то не проще ли значения первого массива использовать как ключи для второго?
т.е. присвоение типа:
PHP:
$arr = array(0 => array('1','2'), 1 => array('1','2'));
преобразовать в:
PHP:
$arr = array(1 => array('1','2'), 2 => array('1','2'));
x-yuri
немного не то, т.к. у человека проблема с выводом на печать ^_^

-~{}~ 02.02.09 14:01:

А если вообще приходят строки, то проще повертеть немного вариант x-yuri....
 

alxander

Новичок
Arqin
дело в том, что, как я написал чуть выше, собственно массивов может быть много, например, [1|2| ][1|2|3][1|2] превращается в массив из 3 элементов, которые также являются массивами.

Попробую поколдовать с извлечением наборов на примере x-yuri.

Вот нашел живой пример такой задачи:
Генерация уникальных фраз
{Раскрутка|Оптимизация} ваших {сайтов|порталов} специалистами.
Перебирает все наборы и склеивает строки, выводя массив из всех подобранных уникальных строк.
 

SiMM

Новичок
Задача элементарная, решается в 2 for'а и 1 while - стыдно должно быть за такими задачками на форум бегать.
 

x-yuri

Новичок
SiMM точно? а я бы рекурсию предложил

-~{}~ 02.02.09 14:24:

можно от этой рекурсии избавится, но это первое, что пришло в голову
а задача не такая уж и простая, имхо
 

SiMM

Новичок
> а задача не такая уж и простая, имхо
Первое, что приходит на ум - элементарный счётчик. Просто система счисления "нестандартная" (в стандартной, например, десятичной, каждая цифра от 0 до 9 - в данной задаче диапазон допустимых значений "цифры" зависит от её позиции).
 

x-yuri

Новичок
SiMM а можешь решение показать? А то, во-первых, рекурсия мне кажется самым простым решением, а во-вторых, не вижу как в твоем варианте обойтись 2 for'ами и 1'м while
 

alxander

Новичок
Я тоже не понимаю, как сделать 2 for'ами и 1'м while.
У меня сейчас без while реализовано. Был бы очень признателен, если бы кто-то показал решение, у самого уже голова дымится...
 

Arqin

Новичок
alxander
судя по вашему примеру... можно обойтись работой со строками и не затрагивать массивы...
просто брать длину строки 1 по ней делать цикл, в нем брать длину строки 2 делать цикл... и так сколько нужно...
Это как вариант, если известно количество получаемых строк...

-~{}~ 02.02.09 17:57:

P.S.: если не ошибаюсь...
 

x-yuri

Новичок
Arqin имхо слишком сложно получится, на какую-то оптимизацию смахивает ;-)

alxander а как сейчас реализовано? без while?
 

alxander

Новичок
Реализовано 2 циклами for (по циклу наборов и по каждому набору в отдельности). Для входных данных вида [1|2][1|2] работает, но шаг вправо, шаг влево (другие входные данные, например, [1|2|3][1|2|3] - уже выдает некорректные результаты, потому что мой вариант создавался под фиксированные входные данные, а на практике будут самые различные - примеры я приводил выше. И вот как из алгоритма по фиксированным данным сделать полноценный - не могу додумать..
 

Армян

Новичок
А какой результат должен быть у такой строки ? [1|2][1|2|3][1|2] ?
111
112
121
...
так ?
 
Сверху