Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Перебор элементов и вывод сортировки алфавитом

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Exponat
Отправлено: 10 Февраля, 2015 - 10:13:36
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Здравствуйте.
Есть данные в таблице:
Atest
Atest1
Atest2
Btest1
Btest2
Ctest1
Ctest2

Можно как то проверять данные на первую букву и соответственно чтоб выводилось типа в таком виде:
A
Atest
Atest1
Atest2
B
Btest1
Btest2
C
Ctest1
Ctest2
Делаю запрос:
PHP:
скопировать код в буфер обмена
  1. echo '<ul>';
  2. $names_brands = DB::query_fetch_all("SELECT id, [name] FROM {shop_brand} WHERE canonical1 = 1");
  3. foreach ($names_brands as $row)
  4. {
  5. $link = $this->diafan->_route->link(8, $row['id'], "shop", "brand");
  6. echo '<li><a href="'.BASE_PATH_HREF.$link.'">'.$row['name'].'</a></li>';
  7. }
  8. echo '</ul>

Этот выводит все. Но как сделать сортировку которую я указал выше?

(Отредактировано автором: 10 Февраля, 2015 - 10:14:56)

 
 Top
RickMan
Отправлено: 10 Февраля, 2015 - 10:47:12
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




- добавь в конце запроса и все.
 
 Top
Exponat
Отправлено: 10 Февраля, 2015 - 10:53:36
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Нет, мне не именно сортировка нужна.
Нужно чтоб ставилась буква (первая из алфавита А) и под этой буквой вывелись все элементы которые начинаются на букву А и т.д. Как сделать такую проверку и вывод?
 
 Top
RickMan
Отправлено: 10 Февраля, 2015 - 11:04:54
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




PHP:
скопировать код в буфер обмена
  1. foreach (range('A', 'Z') as $letter) {
  2.  
  3. }


В этом цикле сделайте еще 1 цикл, уже по записям с БД, и делайте проверку на первую букву, и выводите если совпадает.

http://php.net/manual/ru/function.substr.php - для получения первой буквы
http://php.net/manual/ru/function.strtoupper.php - для приведения к верхеннему регистру.
 
 Top
Exponat
Отправлено: 10 Февраля, 2015 - 11:08:51
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




Спасибо, попробую.
(Добавление)
Сделал через массив:

PHP:
скопировать код в буфер обмена
  1. foreach (range('A', 'Z') as $letter)
  2.         {
  3.         echo '<h6>'.$letter.'</h6>';
  4.         echo '<ul>';
  5.         $names_brands = DB::query_fetch_all("SELECT id, [name] FROM {shop_brand} WHERE import_id = 1");
  6.                         foreach ($names_brands as $row)
  7.                                 {
  8.                                 if ($row[name][0]==$letter)
  9.                                         {
  10.                                         $link = $this->diafan->_route->link(8, $row['id'], "shop", "brand");
  11.                                         echo '<li><a href="'.BASE_PATH_HREF.$link.'">'.$row['name'].'</a>';
  12.                                         echo'</li>';
  13.                                         }
  14.                                 }
  15.                         echo '</ul>';
  16.         }

Все выводит хорошо. Но например на X и Z у меня нет еще записей. Как мне скрыть те буквы для которых нет записей?

(Отредактировано автором: 10 Февраля, 2015 - 11:51:46)

 
 Top
RickMan
Отправлено: 10 Февраля, 2015 - 12:32:53
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




PHP:
скопировать код в буфер обмена
  1. $names_brands = DB::query_fetch_all("SELECT id, [name] FROM {shop_brand} WHERE import_id = 1");


- вынесите этот запрос до первого foreach. Вам нет смысла его выполнять столько раз, достаточно и 1.

В целом должно выйти так:
PHP:
скопировать код в буфер обмена
  1. $names_brands = DB::query_fetch_all("SELECT id, [name] FROM {shop_brand} WHERE import_id = 1");
  2. foreach (range('A', 'Z') as $letter) {
  3.         $added_letter = false;
  4.         foreach ($names_brands as $row) {
  5.                 if (substr($row['name'],0, 1) == $letter) {
  6.                         if (!$added_letter){
  7.                                 $added_letter = true;
  8.                                 echo '<h6>'.$letter.'</h6><ul>';
  9.                         }
  10.  
  11.                         $link = $this->diafan->_route->link(8, $row['id'], "shop", "brand");
  12.                         echo '<li><a href="'.BASE_PATH_HREF.$link.'">'.$row['name'].'</a>';
  13.                         echo'</li>';
  14.                 }
  15.         }
  16.         if ($added_letter){
  17.                 echo '</ul>';
  18.         }
  19. }
 
 Top
GoDr
Отправлено: 10 Февраля, 2015 - 13:03:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




как вариант. Усложни чуть запрос и добавь первую букву сам.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT LEFT(`name`, 1) AS `alfa` ........

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


-----
Система управления веб-содержимым Lotos CMS
 
 Top
RickMan
Отправлено: 10 Февраля, 2015 - 13:07:14
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




GoDr пишет:
как вариант. Усложни чуть запрос и добавь первую букву сам.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT LEFT(`name`, 1) AS `alfa` ........

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


И что это даст? Откажется от substr в пользу усложнения sql?
 
 Top
GoDr
Отправлено: 10 Февраля, 2015 - 13:51:27
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




RickMan пишет:
И что это даст?
ну например читаемость кода и более гибкое управление содержимым Закатив глазки
PHP:
скопировать код в буфер обмена
  1.  
  2. // Имеем такие данные из базы
  3. $rows[0]['alfa'] = 'A';
  4. $rows[0]['name'] = 'Atest1';
  5. $rows[1]['alfa'] = 'A';
  6. $rows[1]['name'] = 'Atest2';
  7. $rows[2]['alfa'] = 'B';
  8. $rows[2]['name'] = 'Btest1';
  9. $rows[3]['alfa'] = 'B';
  10. $rows[3]['name'] = 'Btest2';
  11. $rows[4]['alfa'] = 'C';
  12. $rows[4]['name'] = 'Ctest1';
  13. $rows[5]['alfa'] = 'C';
  14. $rows[5]['name'] = 'Ctest2';
  15.  
  16. /* Выглядит так
  17. Array
  18. (
  19.     [0] => Array
  20.         (
  21.             [alfa] => A
  22.             [name] => Atest1
  23.         )
  24.     [1] => Array
  25.         (
  26.             [alfa] => A
  27.             [name] => Atest2
  28.         )
  29.     [2] => Array
  30.         (
  31.             [alfa] => B
  32.             [name] => Btest1
  33.         )
  34.     [3] => Array
  35.         (
  36.             [alfa] => B
  37.             [name] => Btest2
  38.         )
  39.     [4] => Array
  40.         (
  41.             [alfa] => C
  42.             [name] => Ctest1
  43.         )
  44.     [5] => Array
  45.         (
  46.             [alfa] => C
  47.             [name] => Ctest2
  48.         )
  49. )
  50.  */
  51.  
  52. // Делаем нужный нам тип
  53. $itog = array();
  54. foreach($rows as $value){
  55.     $itog[$value['alfa']][] = $value['name'];
  56. }
  57.  
  58. /* Выглядит так
  59. Array
  60. (
  61.     [A] => Array
  62.         (
  63.             [0] => Atest1
  64.             [1] => Atest2
  65.         )
  66.     [B] => Array
  67.         (
  68.             [0] => Btest1
  69.             [1] => Btest2
  70.         )
  71.     [C] => Array
  72.         (
  73.             [0] => Ctest1
  74.             [1] => Ctest2
  75.         )
  76. )
  77.  */
  78.  
  79. // Приводим в нужный нам человеческий вид и выводим
  80. $result = array();
  81. foreach($itog as $key => $values){
  82.     $result[] = '<h6>' . $key . '</h6>';
  83.     $result[] = '<ul>';
  84.     foreach($values as $value){
  85.         $result[] = '<li>' . $value . '</li>';
  86.     }
  87.     $result[] = '</ul>';
  88. }
  89.  
  90. echo implode('',$result);
  91.  
  92.  
  93. /* выглядит так
  94. A
  95. Atest1
  96. Atest2
  97. B
  98. Btest1
  99. Btest2
  100. C
  101. Ctest1
  102. Ctest2
  103.  */


Не уверен что substr быстрее чем выборка в базе


-----
Система управления веб-содержимым Lotos CMS
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB