За последние 24 часа нас посетил 16051 программист и 1539 роботов. Сейчас ищут 892 программиста ...

Работа цикла for

Тема в разделе "PHP для новичков", создана пользователем vitaver, 10 мар 2009.

  1. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    Ребят, хочу создать список как в проводнике, там с плюсами, нажимаешь на этот плюсик, он открываеться. Вот нашел в нете код, на его примере и хочу сделать, а он выдает мне ошибку Notice: Undefined offset: -1 in(красным выделена)
    <?php
    $fr = file("tx/razdel.txt");

    //$tmp = "";
    //$tmp2 = "";
    //$tmp3 = "";
    $pos = 0;
    for ($i = 0; $i < count($fr); $i++) {
    $pos2 = $pos+1;
    $pos3 = $pos2+1;
    $pos4 = $pos3+1;
    $ifs = false;

    $ar0 = explode("^", trim($fr[$i-1]));
    $ar = explode("^", trim($fr[$i]));
    $ar2 = explode("^", trim($fr[$i+1]));
    //первое вложение begin
    If ($ar[1] <> "") {
    If ($ar[1] <> $tmp) {
    If ($ar[2] == "") {
    echo "
    <tr><td><img src='/pixel.gif' width=15 height=15></td>
    <td nowrap><img src='images/doc.gif' width=16 height=16 border=0> <a href=\"javascript:selectr('$ar[0]', '$ar[1]');\" class='cap2'>$ar[1]</a></td></tr>
    <td></td><td>";
    }
    Else {
    echo "
    <tr><td><img id=node$pos src='images/node_plus.gif' width=15 height=15 onClick=\"showtree($pos)\"></td>
    <td nowrap><img id=folder$pos src='images/closed.gif' width=16 height=14> $ar[1]</td></tr>
    <tr><td></td><td>";
    }
    $tmp = $ar[1];
    }
    Else {
    If ($ar2[1] <> $ar[1]) {
    echo "</td></tr>";
    }
    }
    $ifs = true;
    }
    //первое вложение end


    ..............


    фаил razdel.txt состоит вот так:

    1^Музыка^Хиты^Любэ^Атас
    2^Музика^Хиты^ДДТ^Осень
    .......
    50^Кино^Новинки^Боевики^Стиляги

    Ну и так далее.


    Подскажите что означает это строка: $ar0 = explode("^", trim($fr[$i-1])); и почему выдает ошибку, и вообще не могу логику понять данного скрипта, кто мож объяснит? Могу выложить весь фаил
     
  2. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    $i = 0;
    ...
    $ar0 = explode("^", trim($fr[$i-1]));

    0 - 1 = -1
     
  3. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    Да да да, это и так понятно. Тока вот зачем эта строка нужна, логику не понимаю скрипта, тот кто его написал чтото ведь хотел от этих действий. Зачем он одно и тоже действие делает 3 раза меняя $i. Здесь показано только первое вложение, есть еще три, там меняется только переменные $ar точнее сказать сравниваются. Я хочу перипесать скрипт но понять его до конца не могу, да и не так давно я знаю язык php, поэтому и надеюсь на вашу помощь.
     
  4. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    Ну так ктонибкд мне ответит на мой вопрос кроме 0-1=-1. Знатоки к вам обращаюсь!!!!!!!!! Некж то такой тяжелый вопрос задал?
     
  5. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    explode разбивает строку по разделителю
    http://www.php.ru/manual/function.explode.html

    trim обрезает пробелы в начале и в конце строки
    http://www.php.ru/manual/function.trim.html

    А ошибку он выдает, потому что нет такого элемента в массиве.

    p.s. на будущее - когда выкладываешь код, форматируй его и подсвечивай
    p.p.s. такие скрипты можно и самому написать.... и лучше так делать. да, ошибаясь. да затрахаясь. но ПОНИМАЯ что и как
     
  6. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    Подсвечивать - это на кнопку php нажимать и код между тегами вставлять, да?

    Я полностью с тобой соглашусь в том, что надо писать самому. Но когда раньше не слышал вообще о таком языке как php и о каких либо других языках очень тяжело улавливать логику выполнения сценариев. Про explode и про trim я знаю. Во многом помогает манул php, но про логику там ни слова. Вот я и учусь, что скачиваю примеры интересующих скриптов и разбираю их по полочкам, так во многом понимаешь использование языка, методов его и резальтата работы.
    Вот и спрашиваю. Понять хочется зачем так иммено писать код, ведь понятно что это ошибка, я не думаю что его писал человек это не понимающие. Ме хотябы в двух словах, зачем он промисывает это действия:

    $ar0 = explode("^", trim($fr[$i-1]));
    $ar = explode("^", trim($fr[$i]));
    $ar2 = explode("^", trim($fr[$i+1]));

    Я уже и печатал казжый из массивов, дабы понять зачем? Всеровно на понятно. Происходит смещение на еденицу в верх и в них. Вопрос : ЗАЧЕМ? Зачем он потом сравнивает значение того или иного массива?
    А делаю все для того, чтобы переписать на свой мотив, под свой проект. В конце концов для того чтоб понимать язык и все приемы с ним связаные!!
     
  7. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    И еще вопрос: Что это за знак такой <>? Не больше не меньше - тоесть равенство? Либо не равенство? Описания нигде не встречал именно этого знака.
     
  8. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Знак "не равно". Синоним !=. Может использоваться в mysql, как, впрочем и !=.

    Попробуй print_r($fr) и посмотри, что выведет - если там вообще элементы в массиве, и как это выглядит.
     
  9. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    admyx
    Элементы в масиве есть, но единственное что они сещаються на еденицу в верх и вниз. Вот именно параметр i-1, i+1 играют в этом роль. Я бы с радостью исправил ошибку если бы понимал зачем такое действие. Результат должен быть как дерево папок, смысл того же проводника на компе. Вот нашел такое меню на javascriptе, схожесть есть но здесь это выполнено на пхп.

    PHP:
    1.  
    2. <script language="javascript">
    3. function showtree(id){
    4.         var menu = 'table' + id;
    5.         var folder = 'folder' + id;
    6.         var node = 'node' + id;
    7.         if(document.all(menu) != null){
    8.                 if(document.all(menu).style.display == 'none'){
    9.                         document.all(menu).style.display = '';
    10.                         document.images[folder].src = 'open.gif';
    11.                         document.images[node].src = 'node_minus.gif';
    12.                 }
    13.                 else{
    14.                         document.all(menu).style.display = 'none';
    15.                         document.images[folder].src = 'closed.gif';
    16.                         document.images[node].src = 'node_plus.gif';
    17.                 }
    18.         }
    19. }
    20. </script>
    21.  
    22. <?
    23.  
    24.  
    25. If ($lst == "") {
    26.  $lst = "1";
    27. }
    28. If ($sort == "") {
    29.  $sort = "name";
    30. }
    31.  
    32. $fr = file("tx/razdel.txt");
    33. // здесь пичатает заголовок
    34. for ($m = 0; $m < count($fr); $m++) {
    35.   $arb = explode("^", trim($fr[$m]));
    36.   If ($arb[0] == $rid) {
    37.   $w = 1;
    38.   while ($arb[$w] <> "") {
    39.    $rzd .= "$arb[$w]";
    40.    If ($arb[$w+1] <> "") {
    41.     $rzd .= " &gt;&gt; ";
    42.    }
    43.    $w++;
    44.   }
    45.  }
    46. }
    47. ?>
    48. <table border="0" width="100%" cellspacing="0" cellpadding="0">
    49.   <tr>
    50.     <td width="100%" bgcolor="#98bac3"><p><b>&gt;&gt; Купить &gt;&gt; <? echo $rzd ?></b></p></td>
    51.   </tr>
    52. </table>
    53.  
    54.  
    55. <table border="0" width="100%" cellspacing="10" cellpadding="0">
    56.   <tr>
    57.     <td width="10%" valign="top">
    58. <table border="1" width="98%" bgcolor="#FFFFFF" cellpadding="0" align="center" style="border-collapse: collapse" bordercolor="#98bac3" cellspacing="1">
    59.   <tr>
    60.     <td width="100%" valign="top">
    61.       <table border="0" width="100%" cellspacing="0" cellpadding="0">
    62.         <tr>
    63.            <td width="100%" bgcolor="#98bac3"><p align="center"><b>разделы</b></p></td>
    64.         </tr>
    65.         <tr>
    66.            <td width="100%" valign="top">
    67. <table border="0" cellspacing="0" cellpadding="0">
    68. <?
    69.  
    70. //здесь он производит поиск товара. В болеро он закоментирован, по тому что берет список товара с оф. сайта.
    71. // $d3 = dir("goods/$rid/");
    72. // while($text = $d3->read()) {
    73. //  If ($text <> "." and $text <> ".." and $text <> ".htaccess") {
    74. //   $fgo = file("goods/$rid/" . $text);
    75. //   $asd[] = trim($fgo[2]);
    76. //  }
    77. // }
    78. // $d3->close();
    79.  
    80. // и дальше уже пошло дерево папок раздеров магазина
    81. //$tmp = "";
    82. //$tmp2 = "";
    83. //$tmp3 = "";
    84. $pos = 0;
    85. for ($i = 0; $i < count($fr); $i++) {
    86.  $pos2 = $pos+1;
    87.  $pos3 = $pos2+1;
    88.  $ifs = false;
    89.  
    90.  $ar0 = explode("^", trim($fr[$i-1]));
    91.  $ar = explode("^", trim($fr[$i]));
    92.  $ar2 = explode("^", trim($fr[$i+1]));
    93.  
    94.  $tovc = 0;
    95.   for ($t = 0; $t < count($asd); $t++) {
    96.    If ($asd[$t] == $ar[0]) {
    97.     $tovc = $tovc + 1;
    98.   }
    99.   }
    100.  
    101.  If (strtolower($ar[1]) == strtolower($txtrazdel)) {
    102.  //первое вложение begin
    103.   If ($ar[2] <> "") {
    104.    If ($ar[2] <> $tmp) {
    105.     If ($ar[3] == "") {
    106.  
    107.      echo "
    108. <tr><td><img src='pixel.gif' width=15 height=15></td>
    109. <td nowrap><img src='doc.gif' width=16 height=16 border=0>&nbsp;<a href='buy_$txtlink.php?rid=$ar[0]' class='cap2'>$ar[2]&nbsp;</a>&nbsp;</td></tr>
    110. <td></td><td>";
    111.     }
    112.     Else {
    113.      echo "
    114. <tr><td><img id=node$pos src='node_plus.gif' width=15 height=15 onClick=\"showtree($pos)\"></td>
    115. <td nowrap><img id=folder$pos src='closed.gif' width=16 height=14>&nbsp;$ar[2]&nbsp;</td></tr>
    116. <tr><td></td><td>";
    117.     }
    118.     $tmp = $ar[2];
    119.    }
    120.    Else {
    121.     If ($ar2[2] <> $ar[2]) {
    122.      echo "</td></tr>";
    123.     }
    124.    }
    125.   $ifs = true;
    126.   }
    127.  //первое вложение end
    128.  
    129.  //второе вложение begin
    130.   If ($ar[3] <> "") {
    131.    If ($ar[3] <> $tmp2) {
    132.     If ($ar0[2] <> $ar[2]) { echo "<table border=0 CELLSPACING=0 CELLPADDING=0 style='display: none' id=table$pos>"; $gr1=$pos; }
    133.      If ($ar[4] == "") {
    134.  
    135.       echo "
    136. <tr><td><img src='pixel.gif' width=15 height=15></td>
    137. <td nowrap><img src='doc.gif' width=16 height=16 border=0>&nbsp;<a href='buy_$txtlink.php?rid=$ar[0]&ps=$gr1' class='cap2'>$ar[3]&nbsp;</a>&nbsp;</td></tr>
    138. <td></td><td>";
    139.      }
    140.      Else {
    141.       echo "
    142. <tr><td><img id=node$pos2 src='node_plus.gif' width=15 height=15 onClick=\"showtree($pos2)\"></td>
    143. <td nowrap><img id=folder$pos2 src='closed.gif' width=16 height=14>&nbsp;$ar[3]&nbsp;</td></tr>
    144. <tr><td></td><td>";
    145.      }
    146.     $tmp2 = $ar[3];
    147.    }
    148.    Else {
    149.     If ($ar2[3] <> $ar[3]) {
    150.      echo "</td></tr>";
    151.     }
    152.    }
    153.    If ($ar2[2] <> $ar[2]) {
    154.     echo "</table>";
    155.    }
    156.   $ifs = true;
    157.   }
    158.  //второе вложение end
    159.  
    160.  //третее вложение begin
    161.   If ($ar[4] <> "") {
    162.    If ($ar[4] <> $tmp3) {
    163.     If ($ar0[3] <> $ar[3]) { echo "<table border=0 CELLSPACING=0 CELLPADDING=0 style='display: none' id=table$pos2>\n"; $gr2=$pos2;}
    164.      If ($ar[5] == "") {
    165.  
    166.       echo "
    167. <tr><td><img src='pixel.gif' width=15 height=15></td>
    168. <td nowrap><img src='doc.gif' width=16 height=16 border=0>&nbsp;<a href='buy_$txtlink.php?rid=$ar[0]&ps=$gr2' class='cap2'>$ar[4]&nbsp;</a>&nbsp;</td></tr>
    169. <td></td><td>\n";
    170.      }
    171.      Else {
    172.       echo "
    173. <tr><td><img id=node$pos3 src='node_plus.gif' width=15 height=15 onClick=\"showtree($pos3)\"></td>
    174. <td nowrap><img id=folder$pos3 src='closed.gif' width=16 height=14>&nbsp;$ar[4]&nbsp;</td></tr>
    175. <tr><td></td><td>";
    176.      }
    177.     $tmp3 = $ar[4];
    178.   }
    179.    Else {
    180.     If ($ar2[4] <> $ar[4]) {
    181.      echo "</td></tr>";
    182.     }
    183.    }
    184.    If ($ar2[3] <> $ar[3]) {
    185.     echo "</table>";
    186.    }
    187.   $ifs = true;
    188.   }
    189.  //третее вложение end
    190.  
    191.  
    192.  
    193.   If ($ifs == true) {
    194.    $pos = $pos+2;
    195.   }
    196.  }
    197. }
    198.  
    199.  
    200. ?>
    201.  
    Вот полный код, далее идет поисковик. Код реализован в партнерском магазине болеро и во многих других. Но опять таки выдает ошибку. Мне бы только понять как он работает?
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ошибка возникает на нулевом элементе массива, когда $i - 1 == -1, т.к. минус первого элемента не-ту!
    В 22-ю строчку вставь
    PHP:
     
  11. vitaver

    vitaver Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    22
    Симпатии:
    0
    Адрес:
    Хабаровск
    А что цифра семь означает?