Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Универсальный цикл
 
 автор: Port_Artur1   (30.05.2008 в 11:06)   письмо автору
 
 

Есть цикл для 4 элементов .
$NN состоит из 4 элеменов под него и написан цикл, как написать цикл для любого количества элемиентов в переменной - от 1 до 100.


$NN=($_POST['NN']);
echo"$NN \n".'<br>';


for ($i=0;$i<=strlen($NN)-1;$i++){
$N=substr($NN, $i, 1);
print ($N.'<br>') ;
$array_N[$i]=intval($N);

  for ($i1=2;$i1<=$eng[$array_N[0]-2][1]+1;$i1++){
     for ($i2=2;$i2<=$eng[$array_N[1]-2][1]+1;$i2++){
      for ($i3=2;$i3<=$eng[$array_N[2]-2][1]+1;$i3++){
       for ($i4=2;$i4<=$eng[$array_N[3]-2][1]+1;$i4++){

       print ($eng[$array_N[0]-2][$i1].$eng[$array_N[1]-2][$i2].$eng[$array_N[2]-2][$i3].$eng[$array_N[3]-2][$i4].'<br>') ;

       }
      }
     }
    }


Как сделать для любого количества элементов?
нужно только изменить циклы не могу врубиться как?

   
 
 автор: Port_Artur1   (30.05.2008 в 15:08)   письмо автору
 
   для: Port_Artur1   (30.05.2008 в 11:06)
 

ну этот цикл для 4 элеменов а как например сделать для пяти , только чтобы не дописывать ещё 1 цикл и было универсальным, и годилось для разного количества элеменотов
Помогите пожалуйста.

   
 
 автор: Port_Artur1   (30.05.2008 в 20:03)   письмо автору
 
   для: Port_Artur1   (30.05.2008 в 15:08)
 

HELP
как же написать этот цикл циклов?
Ну очень надо!

   
 
 автор: sim5   (30.05.2008 в 20:07)   письмо автору
 
   для: Port_Artur1   (30.05.2008 в 20:03)
 

Вы знаете, а я так и не понял, что значит универсальный, это как? Чтобы можно было обойти, например, многомерный массив ооооогромадной вложенности?

   
 
 автор: Port_Artur1   (30.05.2008 в 22:05)   письмо автору
 
   для: sim5   (30.05.2008 в 20:07)
 

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

Длина элемента = число вложенности циклов.

   
 
 автор: sim5   (30.05.2008 в 22:20)   письмо автору
 
   для: Port_Artur1   (30.05.2008 в 22:05)
 

В JS у массива будет, дупустим, elements.length, а в РНР число элементов массива - count. И вам нужно будет столько пройти вложенных циклов, сколько потребется для всего обхода массива. Например:

<?
foreach($array as $key => $val) {
   if (
is_array($val)) {
      
//обходим этот массив
   
esle {
     
//обрабатываем значение 
   
}
}

Как вы можете чем-то ограничить в этом случае, если вам неизвестно, что там может быть, как вы говорите выше?

   
 
 автор: BinLaden   (31.05.2008 в 02:02)   письмо автору
 
   для: sim5   (30.05.2008 в 22:20)
 

Лучше вместо foreach использовать array_map():

<?php
function _recursive($v)
{
    if( 
is_array($v) )
    {
        
$v array_map('_recursive'$v);
    }
    else
    {
        
# Обработка значения
    
}
    
    return 
$v;
}
?>

   
 
 автор: sim5   (31.05.2008 в 11:07)   письмо автору
 
   для: BinLaden   (31.05.2008 в 02:02)
 

Я не говорил о том, что использовать, а интересно было узнать, что значит универсальное не известно под что.

   
 
 автор: BinLaden   (31.05.2008 в 13:37)   письмо автору
 
   для: sim5   (31.05.2008 в 11:07)
 

Извиняюсь, если задел Вас. Я лишь сказал для тех, кто не в курсе.

Вы же, безусловно, не нуждаетесь в подобных советах.

   
 
 автор: sim5   (31.05.2008 в 14:13)   письмо автору
 
   для: BinLaden   (31.05.2008 в 13:37)
 

Совет никогда не бывает лишним.) Мне просто охота понять, в чем проблема автора? Может быть он просто не понимает, что сколько элементов массиве не важно, если знать этого не нужно?

   
 
 автор: Trianon   (30.05.2008 в 23:00)   письмо автору
 
   для: Port_Artur1   (30.05.2008 в 11:06)
 

Проще будет применить рекурсию.

   
 
 автор: Port_Artur1   (31.05.2008 в 12:24)   письмо автору
 
   для: Trianon   (30.05.2008 в 23:00)
 

Приношу свои извинения за неправильно поставленный вопрос
Есть массив:

$pon = array(
array(1,4,"1","2","3","4"),
array(2,4,"4","2","3","7"),
array(3,2,"1","2"),
array(4,4,"8","2","3","4"),
array(5,3,"1","5","3"),
array(6,4,"9","2","3","7"),
array(7,4,"3","6","7","8"),
array(8,4,"3","4","6","8"),
array(9,3,"1","2","3"),
array(0,4,"1","2","3","4"),
);


1элемент каждого вложенного массива - цифра.
2элемент - количество элементов массива соответсвующих каждой цифре.

При вводе числа необходимо перебрать все возможные варианты комбинаций и вывести их на экран:

Например вводят число 378
на экране :

133
134
136
138
163
164
166
168
....
и т.д. ну у меня что то вообще в голову не лезет идея написания.
Моджет кто опишет подробней как это надо написать.
Пожалуйста
Вложенные массивы для меня не проблема, а тут облом.

   
 
 автор: sim5   (31.05.2008 в 12:40)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 12:24)
 

А какая связь между 378 и
133
134
136
138
......
и все возможные варианты комбинаций чего?

   
 
 автор: Port_Artur1   (31.05.2008 в 12:48)   письмо автору
 
   для: sim5   (31.05.2008 в 12:40)
 

Да что Вы так акцентируете внимание на связь между этими числами - это необходимо для определённой задачи я немогу её здесь описывать на 10 листов просто нужно как то решить данный участок проблемы связанной с вложенными циклами

Есть массив массивов - нужно произвести перебор и всё
Помогите! если знаете как!

   
 
 автор: sim5   (31.05.2008 в 13:24)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 12:48)
 

Ну а зачем тогда так описывать массив, особенно указывать вторым элементов сколько число эелементов в массиве? Да и если просто обойти - обходите, но вы же сами пишите некое условие по перебору каких-то всевозможных комбинаций и чтобы было так-то и так-то, что же тогда думать о вашей задаче? Почему ваш массив не может быть таким:

$pon = array(
array(1,2,3,4),
array(1,2,3,4),
array(4,2,3,7),
array(1,2),
array(8,2,3,4),
array(1,5,3),
array(9,2,3,7),
array(3,6,7,8),
array(3,4,6,8),
array(1,2,3)
);

В нем все от индекса 0 по индекс 9, а узнать число элементов вложенных массивов (если нужно это) всегда не сложно. Вы ведь сами задаете вопросы запутанные, и сами же возмущаетесь.

   
 
 автор: Port_Artur1   (31.05.2008 в 13:44)   письмо автору
 
   для: sim5   (31.05.2008 в 13:24)
 

Массив может выглядеть и так как вы написали - согласен так даже проще и удобнее.

   
 
 автор: SiM(R)   (31.05.2008 в 12:58)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 12:24)
 


<?php
function recurs($arr)
{
    foreach (
$arr as $kk)
    {
        if (
is_array($kk))  recurs($kk);
        else echo 
$kk.'<br>';
    }
}

recurs($pon);
?>

   
 
 автор: Port_Artur1   (31.05.2008 в 13:35)   письмо автору
 
   для: SiM(R)   (31.05.2008 в 12:58)
 

Но ведь в каждом подмассиве разное количество элементов, как это учесть?

   
 
 автор: BinLaden   (31.05.2008 в 13:38)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 13:35)
 

> Но ведь в каждом подмассиве разное количество элементов, как это учесть?

Хоть SiM(R) и не последовал моему совету, но всё же я не вижу никакой зависимости от количества элементов в его коде.

   
 
 автор: Port_Artur1   (31.05.2008 в 13:46)   письмо автору
 
   для: BinLaden   (31.05.2008 в 13:38)
 

BinLaden помогите решить проблему - видно что ВЫ знаете как это сделать.

   
 
 автор: BinLaden   (31.05.2008 в 13:53)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 13:46)
 

> видно что ВЫ знаете как это сделать

К сожалению, я понимаю что Вы хотите сделать еще меньше других участников.

Вот Ваши слова:

> При вводе числа необходимо перебрать все возможные варианты комбинаций и вывести их на экран:
>
> Например вводят число 378
> на экране :
>
> 133
> 134
> 136
> 138
> 163
> ...

К чему Вы это сказали? Как это связано с перебором массива? И почему должны выводиться именно такие числа?

   
 
 автор: Port_Artur1   (31.05.2008 в 14:12)   письмо автору
 
   для: BinLaden   (31.05.2008 в 13:53)
 

$pon = array(
array(1,2,3,4),
array(1,2,3,4),
array(4,2,3,7),
array(1,2),
array(8,2,3,4),
array(1,5,3),
array(9,2,3,7),
array(3,6,7,8),
array(3,4,6,8),
array(1,2,3)
);

Птому что они соответсвуют элементам подмассивов
сначала берётся 1 элемент массива соответсвующего цифре 3 к нему прибавляется с помощью точки ($s.$e) 1 элемент подмассива соответсвующего цифре 7 и прибаляется 1 элемен соответсвующий цифре 8
затем беруться 1-е элементы первых двух цифр и второй элемент сосответсвующий цифре 8
когда закончатся элементф подмаасива 8
берётся 1 элемент аодмассива тройки
2 элемент подмассива семёрки
и опять перебираем все элементы 8

пока не переберём все варианты.
Я наверное ужасно описываю что должно получиться но увы логичнее не могу, не знаю как ещё подробнее описать

   
 
 автор: sim5   (31.05.2008 в 14:28)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 14:12)
 

Еще запутаннее получилось. Любой из элементов массива $pon - это будет массив, а если говорить о 1 элемент массива соответсвующего цифре 3, то что вы имеете ввиду - 3, это индекс массива $pon, или все таки этому числу должно соответствовать значание первого элемента вложенного массива, или вложенный массив с числом элементов равным 3? В общем запутано и не понятно.

   
 
 автор: Port_Artur1   (31.05.2008 в 14:53)   письмо автору
 
   для: sim5   (31.05.2008 в 14:28)
 

$pon = array(
array(a,s,y,w),
array(g,f,d,e),
array(d,g,h,f),
array(s,d),
array(n,f,g,h),
array(b,n,v),
array(c,b,c,m),
array(v,n,v,b),
array(c,b,n,v),
array(c,v,n)
);

вводим число 123 - получаем список

gds
gdd
ggs
ggd
.....
efs
efd- последнее значение полученное методом перебора,

так понятнее?

извините за моё неуменее правильно объяснять!

Подмассивы массива $pon соответсвуют в своём порядке цифрам от 0 до 9
o
1
2
3
4
5
6
7
8
9

   
 
 автор: sim5   (31.05.2008 в 15:09)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 14:53)
 

Если често, то ничего не понятно. 123 можно связать так - $pon[1][0].$pon[2][0].$pon[3][0], что будет соответствовать gds, но с какого переляку отнести gdd к 123? Какой логикой это связано?

   
 
 автор: Port_Artur1   (31.05.2008 в 15:17)   письмо автору
 
   для: sim5   (31.05.2008 в 15:09)
 

$pon[1][0].$pon[2][0].$pon[3][0]
Вот с этого:

$pon[1][0].$pon[2][0].$pon[3][1]
$pon[1][0].$pon[2][1].$pon[3][0]
$pon[1][0].$pon[2][1].$pon[3][1]
$pon[1][0].$pon[2][2].$pon[3][0]
$pon[1][0].$pon[2][2].$pon[3][1]
$pon[1][0].$pon[2][3].$pon[3][0]
$pon[1][0].$pon[2][3].$pon[3][1]
$pon[1][1].$pon[2][0].$pon[3][0]
$pon[1][1].$pon[2][0].$pon[3][1]
$pon[1][1].$pon[2][1].$pon[3][0]
$pon[1][1].$pon[2][1].$pon[3][1]
$pon[1][1].$pon[2][2].$pon[3][0]
$pon[1][1].$pon[2][2].$pon[3][1]
$pon[1][1].$pon[2][3].$pon[3][0]

.......

$pon[1][3].$pon[2][3].$pon[3][1] - последний

   
 
 автор: sim5   (31.05.2008 в 15:24)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 15:17)
 

И вы думаете, что по предыдущим вашим постам об этом можно было догадаться? У вас даже в этом трудно проследить закономерность.

   
 
 автор: Port_Artur1   (31.05.2008 в 15:31)   письмо автору
 
   для: sim5   (31.05.2008 в 15:24)
 

Виноват - !
Видимо у меня такой же кавардак по данному вопросу, что и впредыдущих постах.

Если теперь понятно помогите пожалуйста!

   
 
 автор: sim5   (31.05.2008 в 15:42)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 15:31)
 

Нет не понятно.
Если кто-то понял закономерность связи 123 с тем, что вы написали в Port_Artur1 (31.05.2008 в 15:17), то пусть он в меня бросит камень. А как будет выглядеть ваша закономерность в Port_Artur1 (31.05.2008 в 15:17), если будет не 123, а 635 ? Пока не будет ясна логика этой связи, думаю, вам никто не поможет.

   
 
 автор: Port_Artur1   (31.05.2008 в 15:48)   письмо автору
 
   для: sim5   (31.05.2008 в 15:42)
 

не буду я в никого ничего бросать
непонятно объяснил -да да причётут взаимосвязи есть вопрос который нужно решить вот и всё.
не думаю, что я так тупо описываю!

   
 
 автор: Port_Artur1   (31.05.2008 в 15:49)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 15:48)
 

cheops взываю к вашей помощи - ВЫ всегда выручали!

   
 
 автор: Port_Artur1   (31.05.2008 в 18:25)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 15:49)
 

HELP, мозги уже не варят

   
 
 автор: Port_Artur1   (31.05.2008 в 20:06)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 18:25)
 

Пока только понял что это дрлжен быть вызов функции из неё самой

   
 
 автор: Киналь   (31.05.2008 в 20:09)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 20:06)
 

:-D

автор: Trianon (30.05.2008 в 23:00) письмо автору

Проще будет применить рекурсию.

   
 
 автор: Port_Artur1   (31.05.2008 в 20:14)   письмо автору
 
   для: Киналь   (31.05.2008 в 20:09)
 

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

   
 
 автор: BinLaden   (31.05.2008 в 20:19)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 20:14)
 

Попробуйте так:

<?php

$pon 
= array(
array(
1234),
array(
1234),
array(
4237),
array(
12),
array(
8234),
array(
153), 
array(
9237),
array(
3678),
array(
3468),
array(
123)
);

function 
reduce_arr(&$pon,  $keys)
{
    
$a = array();

    
$keys = (string) $keys;

    if( !
ctype_digit($keys) )
    {
        return 
false;
    }

    for(
$i 0$i strlen($keys); $i++)
    {
        
$a[] = $pon[$keys[$i]];
    }

    return 
$a;
}

function 
permutation()
{
    global 
$a;
    static 
$nest_lvl,  $prefix;

    
$nest_lvl++;

    if( 
$nest_lvl == count($a) )
    {
        foreach( 
$a[$nest_lvl 1] as $val )
        {
            echo 
$prefix $val "\r\n";
        }
    }
    else
    {
        foreach( 
$a[$nest_lvl 1] as $k => $val )
        {
            
$prefix .= $val;
            
permutation();
            
$prefix substr($prefix0, -1);
        }
    }

    
$nest_lvl--;
}

$a reduce_arr($pon'378');
permutation();
?>


Коряво, правда. Не нравится зависимость от имён.

   
 
 автор: BinLaden   (31.05.2008 в 20:18)   письмо автору
 
   для: Киналь   (31.05.2008 в 20:09)
 

> Проще будет применить рекурсию.

Киналь, примените, нам хочется посмотреть :)

   
 
 автор: Trianon   (31.05.2008 в 20:28)   письмо автору
 
   для: BinLaden   (31.05.2008 в 20:18)
 

пожалуйста :)

   
 
 автор: Trianon   (31.05.2008 в 20:24)   письмо автору
 
   для: Port_Artur1   (31.05.2008 в 12:24)
 

<?php

function generate($prefix$plane)
{
   if(empty(
$plane))
   {
       echo 
"$prefix<br/>\r\n";
       return;
   }

   
$slice $plane[0];
   foreach(
$slice as $digit)
       
generate($prefix.$digit$plane[1]);
}

$pon = array(
'1'=> array("1","2","3","4"),
'2'=> array("4","2","3","7"),
'3'=> array("1","2"),
'4'=> array("8","2","3","4"),
'5'=> array("1","5","3"),
'6'=> array("9","2","3","7"),
'7'=> array("3","6","7","8"),
'8'=> array("3","4","6","8"),
'9'=> array("1","2","3"),
'0'=> array("1","2","3","4")
);

$num "378";

$plane = array();

$i strlen($num);
while( --
$i >= )
    
$plane = array($pon[$num[$i]], $plane);

generate(""$plane);
?>

   
 
 автор: BinLaden   (31.05.2008 в 20:27)   письмо автору
 
   для: Trianon   (31.05.2008 в 20:24)
 

Это Вы г-на Киналя спасли?

   
 
 автор: Trianon   (31.05.2008 в 20:28)   письмо автору
 
   для: BinLaden   (31.05.2008 в 20:27)
 

Да нет... просто на вопрос ответил...

Что-то не нравится? :)

   
 
 автор: BinLaden   (31.05.2008 в 20:29)   письмо автору
 
   для: Trianon   (31.05.2008 в 20:28)
 

Да нет, всё замечательно. :)

   
 
 автор: Trianon   (31.05.2008 в 20:37)   письмо автору
 
   для: BinLaden   (31.05.2008 в 20:29)
 

Собственно, я только что заметил - в Вашем варианте ведь тоже явная рекурсия применена.
Откуда тогда такая ирония в ответе Киналю? :)

   
 
 автор: Port_Artur1   (31.05.2008 в 20:42)   письмо автору
 
   для: Trianon   (31.05.2008 в 20:37)
 

Огромное ВАМ всем спасибо. ОЧЕНЬ выручили теперь дальше пойдет всё как по маслу. Классно!

   
 
 автор: BinLaden   (31.05.2008 в 20:42)   письмо автору
 
   для: Trianon   (31.05.2008 в 20:37)
 

Издрежки прошлой жизни...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования