За последние 24 часа нас посетил 17761 программист и 1651 робот. Сейчас ищут 982 программиста ...

Помогите с обходом массива

Тема в разделе "Решения, алгоритмы", создана пользователем noname2, 13 июл 2013.

  1. noname2

    noname2 Новичок

    С нами с:
    13 июл 2013
    Сообщения:
    3
    Симпатии:
    0
    Необходимо привести

    Код (Text):
    1. $a[0]=array('0');
    2. $a[1]=array('0','1');
    3. $a[2]=array('0','1','2');
    К виду:
    Код (Text):
    1. $out[0]=array('0','0','0');
    2. $out[1]=array('0','0','1');
    3. $out[2]=array('0','0','2');
    4. $out[3]=array('0','1','0');
    5. $out[4]=array('0','1','1');
    6. $out[5]=array('0','1','2');
    Размер массивов $a с ключами всегда разный.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не понял принцип
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    а вот так лучше бы было?
    Код (PHP):
    1. $a = array('0' => array('0'), '1' => array('0','1'), '2' => array('0','1','2'));
    2.  
     
  4. noname2

    noname2 Новичок

    С нами с:
    13 июл 2013
    Сообщения:
    3
    Симпатии:
    0
    Принцип обхода такой: https://www.dropbox.com/s/lnw3c1a2o7mai2e/array.png

    Код для наглядности, он может быть таким:

    $a[0]=array('a','b','c');
    $a[1]=array('d');
    $a[2]=array('e','f');
    $a[3]=array('x');

    Тогда необходимый вид такой:
    $out[0]=array('a','d','e','x')
    $out[0]=array('a','d','f','x')
    $out[1]=array('b','d','e','x')
    $out[1]=array('b','d','f','x')
    $out[2]=array('c','d','e','x')
    $out[2]=array('c','d','f','x')
     
  5. noname2

    noname2 Новичок

    С нами с:
    13 июл 2013
    Сообщения:
    3
    Симпатии:
    0
    Решил проблему так

    Код (Text):
    1. $a['key1']=array('a','v');
    2. $a['key2']=array('b','c','r');
    3. $a['key3']=array('x');
    4. $a['key4']=array('d','e','f');
    5.  
    6.  
    7.  
    8. var_dump($a);
    9.  
    10. $count=1;
    11. foreach($a as $k=>$v){
    12.     $keys[]=$k;
    13.     $_lines[$k]=0;
    14.     $count*=count($v);
    15. }
    16.  
    17. $end=end($keys);
    18.  
    19. for($m=0;$m<$count;$m++){
    20.     $temps=array();
    21.     $stop=false;
    22.     foreach($keys as $sub){
    23.         $temps[$sub][]=$a[$sub][$_lines[$sub]];
    24.         if($sub==$end){
    25.             if(count($a[$sub][$_lines[$sub]+1])){
    26.                 $_lines[$end]++;
    27.             }else{
    28.                 $next=$end;
    29.                 while(!$stop){
    30.                     $key=array_search($next,$keys);
    31.                     $next=$keys[$key-1];
    32.                     if($next){
    33.                         if(count($a[$next][$_lines[$next]+1])){
    34.                             $_lines[$next]++;
    35.                             $stop=true;
    36.                         }else{
    37.                             $_lines[$keys[$key]]=0;
    38.                         }
    39.                     }else{
    40.                         $stop=true;
    41.                     }
    42.                 }
    43.                 $_lines[$end]=0;
    44.                 $_lines[$keys[$key]]=0;
    45.             }
    46.         }
    47.     }
    48.     $temp[]=$temps;
    49. }
    50.  
    51. foreach($temp as $t){
    52.     var_dump($t);
    53.     echo '<br />';
    54. }

    Думаю можно было проще