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

Форум PHP

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

 

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

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

тема: Сформировать список записей ввиде алфавита
 
 автор: web777   (03.10.2008 в 08:52)   письмо автору
 
 

такой вопрос, нужно сформировать список по алфавиту как сделано на странице
smartphone.ua/words.html

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

Все автосалоны хранятся в базе данных, каким образом построить подобную алфавитную структуру через PHP как на том сайте?

  Ответить  
 
 автор: sim5   (03.10.2008 в 08:58)   письмо автору
 
   для: web777   (03.10.2008 в 08:52)
 

Да вам вроде бы ответили в MySQL - ORDER BY name. Или проблема потом разбить этот вывод по алфавиту?

  Ответить  
 
 автор: web777   (03.10.2008 в 14:33)   письмо автору
 
   для: sim5   (03.10.2008 в 08:58)
 

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

Trianon, спасибо большое за ваш пример, сейчас посмотрю

  Ответить  
 
 автор: Trianon   (03.10.2008 в 09:05)   письмо автору
 
   для: web777   (03.10.2008 в 08:52)
 

<?
for($letter ''$row mysql_fetch_assoc($res); )
{
    
$id =  $row['id'];
    
$name $row['name'];
    
$first $name[0];
    if(
$letter != $first)
        echo 
"<br /><h1>".htmlspecialchars($letter=$first)."</h1><br />\r\n";
    echo 
"<a href=?id=$id>".htmlspecialchars($name)."</a><br />\r\n";
}

  Ответить  
 
 автор: web777   (03.10.2008 в 17:45)   письмо автору
 
   для: Trianon   (03.10.2008 в 09:05)
 

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


A
Art-Service 1
A
Art-Service 2
Т
ТурЭкспресс 1
Т
ТурЭкспресс 2

а нужно так


A
Art-Service 1
Art-Service 2

Т
ТурЭкспресс 1
ТурЭкспресс 2


наверное нужно как то формировать массив, где ключ - буква алфавита, а значение найденые записи

  Ответить  
 
 автор: sim5   (03.10.2008 в 18:09)   письмо автору
 
   для: web777   (03.10.2008 в 17:45)
 

У вас после запроса к базе должен быть список отсортированный по имени, и тогда что вам прописал Trianon будут работать как часы.

  Ответить  
 
 автор: Trianon   (03.10.2008 в 19:12)   письмо автору
 
   для: web777   (03.10.2008 в 17:45)
 

фрагмент кода, дамп и результат в студию.

  Ответить  
 
 автор: web777   (03.10.2008 в 19:30)   письмо автору
 
   для: Trianon   (03.10.2008 в 19:12)
 

да всё верно, чёт я сортировку забыл указать, только при запуске почемуто ошибку выдаёт


Parse error: parse error, unexpected ')', expecting ';' in c:\server\www\index.php on line 56


56 строка

for( $letter = '', $row = mysql_fetch_assoc($result); ) {


если эту строку заменяю на


while($row = mysql_fetch_assoc($result)){


то ошибка исчезает и записи выводятся

ниже привожу весь код


<?php
$db_host   
'localhost';
$db_user   'root';
$db_pass   '';
$db_name   'base';
$db_prefix 'pref_';

 
define ("PREFIX"$db_prefix);

$conn mysql_connect($db_host$db_user$db_pass);
mysql_select_db($db_name,$conn);


 
$sql_result "SELECT
 " 
PREFIX "data.id,
 " 
PREFIX "data.description,
 " 
PREFIX "data.name

 FROM `" 
PREFIX "data` ORDER BY name";


$result mysql_query($sql_result);

//while($row = mysql_fetch_assoc($result)){
for( $letter ''$row mysql_fetch_assoc($result); ) {
    
$id =  $row['id'];
    
$name $row['name'];
    
$first $name[0];
    if(
$letter != $first)
        echo 
"<h5>".$first."</h5>\r\n";
    echo 
"<a href=?id=$id>".$name."</a><br />\r\n";
}
?>


при выполнении этого кода, выдаёт ошибку которую упомянул выше

скобки вроде проверил все на месте


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


for( $letter = ''; $row = mysql_fetch_assoc($result); ) {


вот теперь правильно, но список к сожалению не формируется как на том сайте, ниже привожу пример результата


Т
Тимур
Х
хозяйка
У
Управляющая компания ОАО &quot;Новая площадь&quot;
Т
торговый дом &quot;ДАНА&quot;
У
Универсал-Спецтехника-0СПб
Т
ТНТ Клуб
Тотал Авто
Туан
турфирма
турфирма Астрела ООД, Болгария
ТурЭкспресс


и то тут пришлось одну строчку изменить

эту

    $first = $name[0];


на эту

    $first = strtoupper($name[0]);


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

  Ответить  
 
 автор: Trianon   (03.10.2008 в 19:49)   письмо автору
 
   для: web777   (03.10.2008 в 19:30)
 

теперь сравните строки, которые написал я, и которые - Вы.

>если эту строку заменяю на
в этой строке точка с запятой, а не запятая.

А проблема повтора заголовков в строке с первым echo

  Ответить  
 
 автор: web777   (03.10.2008 в 19:56)   письмо автору
 
   для: Trianon   (03.10.2008 в 19:49)
 

да, я ошибся, извиняюсь, я поправил свой выше пост, посмотрите что теперь не так

  Ответить  
 
 автор: Trianon   (03.10.2008 в 20:45)   письмо автору
 
   для: web777   (03.10.2008 в 19:56)
 

исправлений первого echo не обнаружил.

Еслит Вы пишете $first = strtoupper($name[0]);
то следует выполнять case insensitive сортировку.
А так у Вас большие буквы идут сперва, а маленькие - потом.

  Ответить  
 
 автор: web777   (03.10.2008 в 21:08)   письмо автору
 
   для: Trianon   (03.10.2008 в 20:45)
 

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



<?php
define 
("PREFIX"$db_prefix);

$conn mysql_connect($db_host$db_user$db_pass);
mysql_select_db($db_name,$conn);


 
$sql_result "SELECT
 " 
PREFIX "data.id,
 " 
PREFIX "data.description,
 " 
PREFIX "data.name

 FROM `" 
PREFIX "data` GROUP BY name ORDER BY name";


$result mysql_query($sql_result);

for(
$letter ''$row mysql_fetch_assoc($result); )
{
    
$id =  $row['id'];
    
$name $row['name'];
    
$first $name[0];
    if(
$letter != $first)
        echo 
"<br /><h1>".htmlspecialchars($letter=$first)."</h1><br />\r\n";
    echo 
"<a href=?id=$id>".htmlspecialchars($name)."</a><br />\r\n";
}
?>




а вот сам результат


...
т

т.8-905-225-86-64 Роман.

Т

Таганова Елена Георгиевна

Ф

Фарух

т

тамара
танаиф

Т

Тангента.RU
Танита
Татьяна
Татьяна Александровна

У

Украина

Т

ТИРАЖ, Александр
...


тут видно что список формируется не так как нужно.

Единственное как мне видеться, создать массив алфавита на русском и на английском, типа такого
$literal_arr = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');

и через цикл прогнать весь этот массив, плохо только то что запросов получится столько же сколько и букв в алфавите :(

  Ответить  
 
 автор: Trianon   (03.10.2008 в 21:24)   письмо автору
 
   для: web777   (03.10.2008 в 21:08)
 

дамп я так и не увидел.

Непохоже, что данные у Вас упорядочены по русскому алфавиту.

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

  Ответить  
 
 автор: web777   (03.10.2008 в 22:52)   письмо автору
 
   для: Trianon   (03.10.2008 в 21:24)
 

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

$sql_result = "SELECT * FROM `" . PREFIX . "data` ORDER BY name";

список записей можно посмотреть на скрине который я выложил на фото хостинг
http://www.imagebar.net/out.php/i27965_pageee.gif

насчёт дампа, тут я просто подключился к имеющей базе, обычная база с набитыми объявлениями, я так для проверке решил подключится к этой базе. А вообще у меня планы для автосалонов формировать этот алфавитный список.

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



    [Ф] => Фарух | Фирма Профит | ФИРМА ПРОФИТ | фирма Профит | ФИРМА ПРОФИТ | Фирма Профит | Фирма Профит | Фирма Профит | Ферги | 
    [У] => Украина | Управляющая компания ОАО &quot;Новая площадь&quot; | Универсал-Спецтехника-0СПб | 
    [Х] => хирш | хозяйка | 
    [O] => OOO Логос, Михаил Берестов | OOO «ТД ТНК» | OST WEST UNION | 
    [P] => Plastic Technologies | Prague Discover | prava | prestig | prestig | 
    [R] => realtors | RJ | Russian Boat | R_J | 


а вот сам код который формирует массив


<?php
function clear_simvol($text=''){
 return 
trim(str_replace(array(" ","\"","'",
"`","\n","\r",".",",","-","…","!","?",":",";",
"(",")","{","}","[","]","_","=","*","|","«",
"»","+","&","<",">"),"",$text));
}

$arr_list = array();
$literal = array('А','Б','В','Г','Д','Е','Ж','З','И',
'К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц',
'Ч','Ш','Щ','Э','Ю','Я','A','B','C','D','E','F','G',
'H','I','J','K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','Y','Z');
for(
$letter ''$row mysql_fetch_assoc($result); )
{
    
$name clear_simvol($row['name']);
    
$first strtoupper($name[0]);

    if( 
in_array($first,$literal) ){
     
$arr_list[$first] .= ''.$row['name'].' | ';
   }
}
?>

функция clear_simvol() удаляет все не нужные символы в названии, далее строкой

if( in_array($first,$literal) ){
сверяем и выбираем только те записи у которых начальная буква слова присутствует в массиве

примерно так, сейчас у меня немного поменялись планы, решил сделать также как тут hotprice.com.ua/brands/

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

  Ответить  
 
 автор: Trianon   (03.10.2008 в 23:07)   письмо автору
 
   для: web777   (03.10.2008 в 22:52)
 

Надо не извиняться, а переделать.
Элементы массива вовсе не обязаны располагаться на одной строке.

  Ответить  
Rambler's Top100
вверх

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