Forum Webscript.Ru

Программирование => PHP => Тема начата: kornels от 27 Июня 2002, 10:43:56

Название: Друзья, помогите чайнику!
Отправлено: kornels от 27 Июня 2002, 10:43:56
Я хочу переделать скрипт фотоальбома так, чтобы слева выводилось по 20 подписей к фото, а ниже страницы 1,2,3, ... каждая по 20 фото, подскажите пожалуйста, как это сделать?
Скрипт ниже.


                       
                       
Чемпионы

$basefile="champ.dat";
?>

 

$file=fopen($basefile, "r");
$rf = fread($file, filesize ($basefile));
fclose($file);
$records = explode("\\r\\n", $rf);
$total = count($records) -1;
if(!isset($what)){$what=0;};
   for($i=0; $i <= $total; $i++){
       $record = explode("::", $records[$i]);
       $showi = $i+1;
       $showis = $record[1];
       $counter++;
          if($what==$i){echo "$showis
";
          } else {
                echo "
  • $showis
     ";}
                      if($counter==$per_page) { break; }
    }


    ????????????????????


    ?>                      
             

  • $therecord = explode("::", $records[$what]);
    echo "\\"".$therecord[1]."\\"
    ";
    echo "
  • ".$therecord[1]."
    ";
    $nadprecord = explode("::", $records[$what]);
    echo "".$nadprecord[2]."

    ";
    if($what != 0){
      $previ = $what-1;
      echo "Предыдущая | ";
     }
     if($what < $total){
      $nexti = $what+1;
      echo " Следующая ";
     }
    ?>

  • Название: Друзья, помогите чайнику!
    Отправлено: ThE0ReTiC от 27 Июня 2002, 11:02:56
    http://forums.webscript.ru/showthread.php?s=&postid=22937#post22937
    http://forums.webscript.ru/showthread.php?s=&postid=36300#post36300
    Пользуйся поиском по форуму.
    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 28 Июня 2002, 12:02:23
    Спасибо конечно, но мне нужна более "чайниковская" консультация, я ведь только начинаю!
    Название: Друзья, помогите чайнику!
    Отправлено: Maniac от 28 Июня 2002, 12:34:11
    Даю совсем уж чайниковую консультацию. Написанный тобой скрипт совсем не оптимален (и очень даже совсем).
    Во-первых, зачем ты считываешь данные из файла, а затем разбиваешь их на строки, которые потом преобразуешь в массив, который потом пользуешь целиком, когда практически все за тебя уже сделали добрые создатели PHP.

    Для того, чтобы считать строки из файла есть специальная функция file(), которая не требует от тебя даже открытия файла и возвращает массив, разбитый на строки.

    Далее, уж коли ты делаешь массив - оптимизируй его, позволь php делать то, что он умеет делать. Функция array_chunk разбивает массив на куски.
     
    Ну и, наконец, зачем использовать один цикл в котором проводится проверка дабы не гипперлинкить текущую страницу, когда такая проверка проводится за тебя компилятором (при прокрутке цикла)? Разбиваешь его на два - и нет проблем.
    Итак, я думаю, ты понял то, что я хотел тебе сказать :)) Поэтому на сладкое привожу код, который делает почти все, что тебе хочется.

    Итак, файл myphotos.txt содержит информацию в формате :
    адрес_картинки::подпись_картинки.
    Поехали...

    if (!isset($cur_chunk)) $cur_chunk=0;
    $names=file(\'myphotos.txt\');
    $names=array_chunk($names,20);

    foreach ($names[$cur_chunk] as $photo)
    {
        $photo=explode ("::",$photo);
        print "".$photo[1]."
    ";
    }

    print "

    ";
    for ($i=0;$i<$cur_chunk;$i++)
        print "$i | ";
    print "$i | ";
    for ($i=$cur_chunk+1;$i    print "$i | ";
    ?>
    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 28 Июня 2002, 14:20:29
    Maniac
    Попробовал протестировать твой код, выдается ошибка:
    Fatal error: Call to undefined function: array_chunk() in f:\\www\\test.php on line 4
    ???
    Название: Друзья, помогите чайнику!
    Отправлено: Меняздесьдавнонет от 28 Июня 2002, 14:39:56
    Чунк тут сто лет не нужен.
    Тем более, если менять версию РНР из-за нее.
    Не все ставят себе новый РНР за два дня до выхода. Некоторые работают на старом и проверенном.

    kornels
    Тебе надо просто почитать популярную какую-нибудь книжку про циклы, программирование...
    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 28 Июня 2002, 14:44:55
    RomikChef
    Скажи пожалуйста свое мнение о книге PHP4 Д. Котерова.
    Название: Друзья, помогите чайнику!
    Отправлено: Меняздесьдавнонет от 28 Июня 2002, 15:31:51
    Не читал, но Котерова уважаю.
    Он в чем-то наивный, но старательный.
    Но в данном случае тбе эта книга поможет слабо.
    Ну, это все равно, что человеку, который вообще водить машину не умеет, рассказывать, чем отличается вождение автобуса от легковушки.
    Тебе надо принцип понимать, а не то, как он реализуется в РНР.
    Тебе надо просто учебник программирования а не конкретно РНР.
    Есть массив. Нумерованные строчки.
    Их можно перебрать циклом, подставляя все возрастающую переменную в индекс массива.
    Это как ячейки в камере хранения. Заглядываем в первую, вторую, третью... сотую.
    Но можно же заглядывать сначала с порвой по десятую, потом с 11 по 20...  и так далее.
    просто в цикл подставлять эти цифры.
    от 21 до 30 по одному подставляем все значения, увеличивая на единицу.
    Число, от которого начинать перебор, передаем по ссылке. Число, до которого перебирать получаем прибавив к первому число ссылок на странице.

    что здесь такого трудного - я правда не понимаю.
    Вместо
    for($i=0; $i <= $total; $i++){
    написать
    for($i=$start; $i <= $start+$fotok_per_page; $i++){
    Название: Друзья, помогите чайнику!
    Отправлено: Maniac от 30 Июня 2002, 14:28:40
    RomikChef
    Вообще-то с точки зрения логики удобнее сразу разбить массив на сегменты дабы в случае возникновения надобности обрабатывать такие сегменты как-то по особому не возиться с циклами и не усложнять программу.
    А array_chunk() работает в версиях начиная с 4.0  - он, по-твоему, зарелизен за два дня до выхода?

    kornels
    Исходник array_chunk (взял с php.net, так что претензии к автору):
    Цитировать


    function array_chunk ($a, $s, $p=false) {
     $r = Array();
     $ak = array_keys($a);
     $i = 0;
     $sc = 0;
     for ($x=0;$x  if ($i == $s){$i = 0;$sc++;}
      $k = ($p) ? $ak[$x] : $i;
      $r[$sc][$k] = $a[$ak[$x]];
      $i++;
     }
     return $r;
    }

    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 30 Июня 2002, 18:27:29
    Maniac
    Посмотри пожалуйста, что опять не так делаю.
    Скрипт строки считает, говорит на сколько разбито страниц, а на следующую двадцатку не переводит?
    Мне не до изысков, лишь бы надежно работал.

     

    $basefile="champ.dat";
    $per = 22;
    $file=fopen($basefile, "r");
    $rf = fread($file, filesize ($basefile));
    fclose($file);
    $records = explode("\\r\\n", $rf);
    $total = count($records) -1;
    $start = 0;
    if(!isset($what)) $what=0;
    for($i=$start; $i <= $start+$per; $i++)
    {
    $record = explode("::", $records[$i]);
    $showi = $record[1];
    if($what==$i){echo "$showi
    ";
    }
    else
    {
    echo "
  • $showi
     ";
    }
    }
    $general=file($basefile);
    $lines=count($general);
    $all_foto = $lines;
    $pfoto = file("$basefile");
    if ($page == "" or $page < 0)
    {
    $page = "1";
    }
    $first = count($pfoto) - ($per * ($page - 1));
    $second = count($pfoto) - ($per * $page) + 1;
    if ($second < 1)
    {
    $second = 1;
    }
    $pages = (int) ((count($pfoto) + $per) / $per);
    $line = "$symbol";
    for ($per = 1; $per <= $pages; $per++)
    {
    if ($per != $page)
    {
    $line .= " $per $symbol";
    }
    if ($per == $page)
    {
    $line .= " $per $symbol";
    }
    }
    echo "
    ";
    echo "Cтраница: $line";
    ?>                    

  • $therecord = explode("::", $records[$what]);
    echo "\\"".$therecord[1]."\\"
    ";
    echo "
  • ".$therecord[1]."
    ";
    $nadprecord = explode("::", $records[$what]);
    echo "".$nadprecord[2]."

    ";
    if($what != 0){
      $previ = $what-1;
      echo "Предыдущая | ";
     }
     if($what < $total){
      $nexti = $what+1;
      echo " Следующая ";
     }
    ?>

  • Название: Друзья, помогите чайнику!
    Отправлено: Maniac от 30 Июня 2002, 18:41:46
    А с чего бы ему переходить правильно? Ты же каждый раз, когда бежишь по страницам, начинаешь с одного и того же значения $start=0? :)
    Исправь $start=0; на
    $start=($page-1)*$per;

    и все заработает
    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 01 Июля 2002, 17:00:15
    Maniac
    Спасибо за подсказку.
    Действительно скрипт заработал, но при его запуске появляется только первая запись из champ.dat без ссылок на другие записи, а при постраничном переходе ссылки появляются, но при клике по ним попадаю на начало скрипта. Т. е. показывается только первая запись из champ.dat.
    Как быть с этим?
    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 11 Июля 2002, 19:33:54
    Кто-нибудь! проверьте пожалуйста!
    $show = "20";
    $file = file(\'champ.dat\');
    $count = count($file);
    $start = $show * ($page - 1);
    if(! isset ($what)) $what = 0;
       for($i = $start; $i <= $start+$show; $i++){
           $record = explode("::", $file[$i]);
           $showi = $record[1];
              if($what==$i){echo "$showi
    ";
              } else {
                    echo "$showi
     ";}
    }
    $pages = (int) (($count + $show - 1) / $show);
    if (!is_numeric($page) or $page < 1 or $page > $pages)
    {
    $page = "1";
    }
    $beginning = $count - ($show * ($page - 1));
    $end = $count - ($show * $page) + 1;
    if ($end < 1)
    {
    $end = 1;
    }
    for ($show = 1; $show <= $pages; $show++)
    {
    if ($show != $page)
    {
    $navigation .= " |$show| ";
    }
    if ($show == $page)
    {
    $navigation .= "|$show|";
    }
    }
    echo "
    ";
    echo "Cтраница: $navigation";
    $therecord = explode("::", $file[$what]);
    echo "\\"".$therecord[1]."\\"
    ";
    echo "
  • ".$therecord[1]."
    ";
    $nadprecord = explode("::", $file[$what]);
    echo "".$nadprecord[2]."

    ";
    if($what != 0){
      $previ = $what-1;
      echo "Предыдущая | ";
     }
     if($what < $count){
      $nexti = $what+1;
      echo " Следующая ";
     }
    ?>
  • Название: Друзья, помогите чайнику!
    Отправлено: Covex от 11 Июля 2002, 21:34:13
    array_chunk
    (PHP 4 >= 4.2.0)
    Название: Друзья, помогите чайнику!
    Отправлено: kornels от 12 Июля 2002, 13:34:19
    Про array_chunk я уже понял, что версия другая. Но мой скрипт над предыдущей зписью не работает так, как хочется.
    Если не трудно, проверьте и подскажите что не так.
    Название: Друзья, помогите чайнику!
    Отправлено: Maniac от 14 Июля 2002, 15:40:39
    Значит так: вкючи в php.ini все ошибки и notice - и запусти.
    Я когда твой скрипт запустил - пришел в ужас.
    Название: Друзья, помогите чайнику!
    Отправлено: Tronyx от 14 Июля 2002, 22:08:33
    Заново прочти свою книгу "Самоучитель PHP4" (Д.Котеров). PHP я учил с нуля именно по ней, всё написано понятным языком и можно без проблем выучить PHP начиная с неё, а у тебя знаний на ноль с половиной (незнать функцию file() это ИМХО не простительно! Как ты книгу читал ???)