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

Форум PHP

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

 

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

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

тема: Алфавитный рубрикатор
 
 автор: Bvz   (19.01.2010 в 11:57)   письмо автору
 
 

как делается, как здесь http://moscowroma.com/allfactories/

  Ответить  
 
 автор: Саня   (19.01.2010 в 12:16)   письмо автору
 
   для: Bvz   (19.01.2010 в 11:57)
 

<?
$arr 
= array(
    
'A' => array(
        
'ACCADEMIA',
        
'AEMME ITALIA',
        
'ALBERTA SALOTTI'
    
),
    
'B' => array(
        
'B.M. STYLE',
        
'BACCI'
    
)
);

foreach ( 
$arr as $letter => $list ) {
    print 
'<h2>'.$letter.'</h2>';
    foreach ( 
$list as $entry ) {
        print 
$entry.'<br>';
    }
}

  Ответить  
 
 автор: Bvz   (19.01.2010 в 12:33)   письмо автору
 
   для: Саня   (19.01.2010 в 12:16)
 

а если все фабрики в бд забиты

  Ответить  
 
 автор: Саня   (19.01.2010 в 12:38)   письмо автору
 
   для: Bvz   (19.01.2010 в 12:33)
 

Значит выбирайте из базы все имена и формируете массив какой я показал. Отрезать первую букву можно функцией substr().

  Ответить  
 
 автор: Bvz   (19.01.2010 в 12:54)   письмо автору
 
   для: Саня   (19.01.2010 в 12:38)
 

а есть ли функция, которая работает с буквами латинского алфавита?

  Ответить  
 
 автор: sim5   (19.01.2010 в 13:32)   письмо автору
 
   для: Bvz   (19.01.2010 в 12:54)
 

А которая работает с буквами русского есть?

  Ответить  
 
 автор: Николай2357   (19.01.2010 в 16:32)   письмо автору
 
   для: Саня   (19.01.2010 в 12:38)
 

Не надо так делать. Есть для этого более другой способ:
MID(`field`, 1, 1) = 'A'

  Ответить  
 
 автор: Loki   (19.01.2010 в 16:37)   письмо автору
 
   для: Николай2357   (19.01.2010 в 16:32)
 

А как Вы по такой хреновине индексы строить собираетесь?

  Ответить  
 
 автор: Николай2357   (19.01.2010 в 17:06)   письмо автору
 
   для: Loki   (19.01.2010 в 16:37)
 

Ага, окарал.((( Спутал с поиском. Просто только что такой делал и навеяло.
Прошу пардона.

  Ответить  
 
 автор: Bvz   (20.03.2010 в 11:01)   письмо автору
 
   для: Саня   (19.01.2010 в 12:16)
 

сделал так, получился такой массив

Array
(
    [A] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [published] => 1
                    [name] => Abhika
                    [url] => www.abhika.it
                    [main] => 0
                    [letter] => A
                )

и т.д.


не могу понять как его вывести теперь по принципу?

А
Abhika и т.д.
В

  Ответить  
 
 автор: neadekvat   (20.03.2010 в 11:45)   письмо автору
 
   для: Bvz   (20.03.2010 в 11:01)
 

<?php
// входной массив
$arr = Array 

    
'A' => Array 
        ( 
            
'0' => Array 
                ( 
                    
'id' => ,
                    
'published' => ,
                    
'name' => 'Abhika' ,
                    
'url' => 'www.abhika.it' ,
                    
'main' => ,
                ),
            
'1' => Array 
                ( 
                    
'id' => ,
                    
'published' => ,
                    
'name' => 'Abhikdsfdsfsdfdsa' ,
                    
'url' => 'www.abhika.it' ,
                    
'main' => ,
                )
          ),
          
      
'B' => Array 
        ( 
            
'0' => Array 
                ( 
                    
'id' => ,
                    
'published' => // неопубликованный
                    
'name' => 'Bbhika' ,
                    
'url' => 'www.abhika.it' ,
                    
'main' => ,
                ),
            
'1' => Array 
                ( 
                    
'id' => ,
                    
'published' => ,
                    
'name' => 'Bbhikdsfdsfsdfdsa' ,
                    
'url' => 'www.abhika.it' ,
                    
'main' => ,
                )
          ),
);

// код вывода
foreach ($arr as $key_0 => $value_0) {
echo 
$key_0':<br>';
 foreach (
$value_0 as $key_1 => $value_1) {
  if (!
$value_1['published']) continue; // неопубликованные пропускаем
  
echo $value_1['id'], ' :: ',  $value_1['name'], '<br>';
 }
}
?>


Результат:
A:
1 :: Abhika
2 :: Abhikdsfdsfsdfdsa
B:
2 :: Bbhikdsfdsfsdfdsa

  Ответить  
 
 автор: Bvz   (20.03.2010 в 12:00)   письмо автору
 
   для: neadekvat   (20.03.2010 в 11:45)
 

СПАСИБИЩЕ!!!
а вы можете подробнее разписать почему так сделалаи?

  Ответить  
 
 автор: neadekvat   (20.03.2010 в 12:02)   письмо автору
 
   для: Bvz   (20.03.2010 в 12:00)
 

В каком смысле "почему"? о_О

  Ответить  
 
 автор: Bvz   (20.03.2010 в 14:58)   письмо автору
 
   для: neadekvat   (20.03.2010 в 12:02)
 

ну описать логику, что делается и для чего?

  Ответить  
 
 автор: neadekvat   (20.03.2010 в 15:24)   письмо автору
 
   для: Bvz   (20.03.2010 в 14:58)
 

Что именно вам не понятно? Там 5 строчек кода и только одна функция..

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 17:33)   письмо автору
 
   для: Bvz   (19.01.2010 в 11:57)
 

мб что-то типа
<?php
while($array mysql_fetch_assoc($query)) {
$word $array['name'];
$char substr($word1);
$arr[$char][] = $word;
}

где $word - название чего-то там.
таким образом у вас будет массив $arr..а дальше - сортируете по алафвиту, и как Саня показал.

  Ответить  
 
 автор: sim5   (19.01.2010 в 17:57)   письмо автору
 
   для: neadekvat   (19.01.2010 в 17:33)
 

Ну а если отсортированный запрос и сразу вывод?

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 20:03)   письмо автору
 
   для: sim5   (19.01.2010 в 17:57)
 

Не совсем понял, что вы имеете в виду

  Ответить  
 
 автор: sim5   (19.01.2010 в 20:52)   письмо автору
 
   для: neadekvat   (19.01.2010 в 20:03)
 

Я так понимаю, что в базе есть записи от А до Я, и их надо вывести под этими литерами. Значит получаем эти отсортированные записи, беря первую литеру каждой группы, а под ней сами записи, и все это непосредственно в цикле while.

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 21:01)   письмо автору
 
   для: sim5   (19.01.2010 в 20:52)
 

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

  Ответить  
 
 автор: sim5   (19.01.2010 в 21:02)   письмо автору
 
   для: neadekvat   (19.01.2010 в 21:01)
 

Зачем искать конец группы?

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 21:21)   письмо автору
 
   для: sim5   (19.01.2010 в 21:02)
 

Ну, если мы вытаскиваем все записи из бд, то надо определить, где начало группы слов, начинающихся на определенную букву, и где её конец.
Или я вас недопонял?

  Ответить  
 
 автор: sim5   (19.01.2010 в 21:25)   письмо автору
 
   для: neadekvat   (19.01.2010 в 21:21)
 

Все просто - само определится :)
Ну у вас ресурс отсортированный, то есть здесь не будет "подвоха", все по порядку. Устанавливаем вне цикла переменную А, которая изначально имеет пустое значение.
В цикле проверяем:
если первая литера значения записи не равна А, то присваиваем А эту литеру, а также выводим ее, плюс выводим запись,
иначе выводим запись.
Все.

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 21:34)   письмо автору
 
   для: sim5   (19.01.2010 в 21:25)
 

Ну, с одной буквой, вот так:
<?php $a '';
// запрос, пусть $char - первая буква, $word - все слово
if ($a == 'A') {
  echo 
$word;
} else {
  
$a 'A';
  echo 
$word;
}

Вы так имеете в виду?

  Ответить  
 
 автор: sim5   (19.01.2010 в 21:39)   письмо автору
 
   для: neadekvat   (19.01.2010 в 21:34)
 

Я понимаю, что нужно получить такое:
<?
$a 
= array('aa1','aa2','aa3','bb1','bb2','bb3');
$w '';
for(
$i=0$i<count($a); $i++){
  if (
$w != substr($a[$i],01)) {
    print 
substr($a[$i],01). "<BR>&nbsp;&nbsp;" $a[$i] . "<BR>";
    
$w=substr($a[$i],01);
  } else print 
"&nbsp;&nbsp;" $a[$i] . "<BR>";
}

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 21:53)   письмо автору
 
   для: sim5   (19.01.2010 в 21:39)
 

Это при условии, что у нас есть массив $a, а если его нет, т.е. его опять же нужно составлять, вытаскивая значения из базы, получается так?

  Ответить  
 
 автор: sim5   (19.01.2010 в 22:01)   письмо автору
 
   для: neadekvat   (19.01.2010 в 21:53)
 

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

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 22:10)   письмо автору
 
   для: sim5   (19.01.2010 в 22:01)
 

Ну, например, записи в бд:
Арбуз
Азбука
Арка
Аккордеон
Басня
Башня
Башмак
Бур
Весна
Ветер
Замок
Черкизон

Пусть $query - это запрос, который выводит эти слова.
Как вы отсортируете это так, чтобы было
А
Арбуз
Азбука
Арка
Аккордеон
Б
Басня
Башня
Башмак
Бур
И т.д.
Если бы у нас был массив array('А', 'Б', 'В', 'З', 'Ч') - тогда все ясно
Но ведь его нет, надо узнать, какие буквы в принципе есть

  Ответить  
 
 автор: sim5   (19.01.2010 в 22:13)   письмо автору
 
   для: neadekvat   (19.01.2010 в 22:10)
 

И чем строки в ресурсе: Арбуз, Азбука, Арка, Аккордеон, Басня, Башня, Башмак, Бур, Весна..... отличается от явного указанного массива: Арбуз, Азбука, Арка, Аккордеон.... ?
Зачем вспомогательный массив (А,Б,В....)?
Зачем предварительно узнавать какие буквы есть?

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 22:21)   письмо автору
 
   для: sim5   (19.01.2010 в 22:13)
 

Допёр.
Пойду-ка спать :о)

  Ответить  
 
 автор: Bvz   (29.01.2010 в 12:13)   письмо автору
 
   для: neadekvat   (19.01.2010 в 22:21)
 

вот так

  <?php

  
// Формируем запрос на извлечение первых
  // букв товарных позиций
  
$fsql "SELECT SUBSTRING(name,1,1) AS letter FROM `factory` GROUP BY letter ORDER BY letter";
  
$fletter mysql_query($fsql);
  if(!
$fletter) exit(mysql_error());
  
// Если имеется хотя бы одна запись
  // выводим её
  
if(mysql_num_rows($fletter) > 0)
  {
    while(
$factory mysql_fetch_assoc($fletter))
    {
      echo 
"<p class=\"letter\">".$factory[letter]."</p>";

            
// Выводим товарные позиции
            
$nsql "SELECT * FROM `factory` WHERE SUBSTRING(name,1,1) = '$factory[letter]'";
            
$name mysql_query($nsql);
            if(!
$name) exit(mysql_error());

            
// Если в текущем каталоге имеется хотя бы
            // одна товарная позиция выводим её
            
if(mysql_num_rows($name) > 0)
            {
              while(
$fname mysql_fetch_assoc($name))
              {
                echo 
$fname[name]."<br />";
              }
            }
    }
  }
?>

  Ответить  
 
 автор: sim5   (29.01.2010 в 12:25)   письмо автору
 
   для: Bvz   (29.01.2010 в 12:13)
 

Ну во-первых, а не накладно ли?

  Ответить  
 
 автор: Bvz   (29.01.2010 в 12:35)   письмо автору
 
   для: sim5   (29.01.2010 в 12:25)
 

в смысле накладно?

  Ответить  
 
 автор: sim5   (29.01.2010 в 12:41)   письмо автору
 
   для: Bvz   (29.01.2010 в 12:35)
 

То есть не понимаем что такое производительность?

  Ответить  
 
 автор: Bvz   (29.01.2010 в 12:43)   письмо автору
 
   для: sim5   (29.01.2010 в 12:41)
 

не совсем, только догадываюсь :)
а как лучше сделать, в какую сторону копать?

  Ответить  
 
 автор: sim5   (29.01.2010 в 12:46)   письмо автору
 
   для: Bvz   (29.01.2010 в 12:43)
 

Ну если о копать, то копают вниз и в нужном направлении, куда вам надо, я не знаю.
А вот если о выводе списка, то достаточно одного запроса. И об этом рассказывалось выше. Почему вы "копаете" именно так, трудно предположить даже, видимо вы о всем только догадываетесь, а этого явно мало.

  Ответить  
 
 автор: Bvz   (29.01.2010 в 12:51)   письмо автору
 
   для: sim5   (29.01.2010 в 12:46)
 

да согласен я только учусь, попробую одним запросом сделать, это JOIN правильно?

  Ответить  
 
 автор: sim5   (29.01.2010 в 13:12)   письмо автору
 
   для: Bvz   (29.01.2010 в 12:51)
 

А вы как думаете?
Учиться применять инструменты - да, думать отвлеченно - вы должны уметь. РНР не догма, это инструмент, всего лишь.
Как бы вы поступили, решая эту задачу карандашом на бумаге? У вас есть список, и чтобы написать его упорядоченно, что вы сделаете? Поступите вполне естественно - по алфавиту.
Что вам нужно будет для того, чтобы перед каждым выводом списка начинающегося с каждой литерой алфавита, вывести эту литеру? Просто посмотреть - прописывали вы ли ее уже.
А чего будет достаточно для того, чтобы понять - пора ли писать новую литеру? Просто посмотреть - первая буква следующего слова та же что и прописанная литера или нет.
Вот этого нет в учебниках РНР, этому они вас не научат. Это способность к мышлению, базирующаяся на вполне естественном представлении нашем.

И как теперь все это сделать с помощью инструментов РНР?

  Ответить  
 
 автор: Bvz   (29.01.2010 в 13:27)   письмо автору
 
   для: sim5   (29.01.2010 в 13:12)
 

спасибо, пошел рисовать :)
а где научиться правильно мыслить?

  Ответить  
 
 автор: sim5   (29.01.2010 в 13:36)   письмо автору
 
   для: Bvz   (29.01.2010 в 13:27)
 

Правильно мыслить учит только Партия! ;-)
А развивать мышление помогают книги.

  Ответить  
 
 автор: Bvz   (29.01.2010 в 13:42)   письмо автору
 
   для: sim5   (29.01.2010 в 13:36)
 

какие?

  Ответить  
 
 автор: sim5   (29.01.2010 в 13:47)   письмо автору
 
   для: Bvz   (29.01.2010 в 13:42)
 

Самые разнообразные - чем больше в вас "любопытства", тем лучше.

  Ответить  
 
 автор: Bvz   (29.01.2010 в 13:52)   письмо автору
 
   для: sim5   (29.01.2010 в 13:47)
 

Супер - Спасибо!!!
а как правильно читать?

  Ответить  
 
 автор: sim5   (29.01.2010 в 14:16)   письмо автору
 
   для: Bvz   (29.01.2010 в 13:52)
 

Слева на право, сверху вниз :)
Ставьте перед собой простые задачи и учитесь находить наиболее выгодные решения. В конце концов можете купить конструктор Лего, кубик Рубика, решать ребусы и другие задачки в журнале Мурзилка :)
Интересуйтесь жизнью, в ней много интересного, пробуйте, анализируйте. Театр, книги, прекрасная музыка, все это для творческого развития личности, а творческий подход пригодится во всех сферах деятельности. Математика, геометрия, физика, это дисциплины, которые развивают логическое мышление необходимое в программировании.
Если у вас есть жадность к познанию, значит все получится.

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 14:20)   письмо автору
 
   для: Bvz   (29.01.2010 в 13:52)
 

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

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 14:24)   письмо автору
 
   для: sim5   (29.01.2010 в 13:12)
 

Рисовать сложные запросы/алгоритмы на бумаге - +1
Порой сложно в голове представить это, особенно после энного числа за работой

  Ответить  
 
 автор: sim5   (29.01.2010 в 14:52)   письмо автору
 
   для: neadekvat   (29.01.2010 в 14:24)
 

Ну собственно блок-алгоритмы не я придумал, они в учебниках для "прогеров" всегда имеются - картинки с прямоугольниками и ромбиками :)

  Ответить  
 
 автор: neadekvat   (29.01.2010 в 14:55)   письмо автору
 
   для: sim5   (29.01.2010 в 14:52)
 

Я до них еще не дошел))

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

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