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

Форум PHP

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

 

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

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

тема: как отделить от общей массы заглавную букву
 
 автор: dirol   (13.02.2009 в 11:21)   письмо автору
 
 

есть скрипт вывода погоды . при выборе города хочется чтобы было как тут http://weather.yandex.ru/russia/

все города отделяются большой буквой. как такое сделать из списка ?

  Ответить  
 
 автор: cheops   (13.02.2009 в 13:27)   письмо автору
 
   для: dirol   (13.02.2009 в 11:21)
 

А города где находятся в массиве, в базе данных?

  Ответить  
 
 автор: AcidTrash   (13.02.2009 в 15:10)   письмо автору
 
   для: dirol   (13.02.2009 в 11:21)
 

Воспользуйтесь функцией
ucfirst("город");

  Ответить  
 
 автор: dirol   (13.02.2009 в 16:15)   письмо автору
 
   для: AcidTrash   (13.02.2009 в 15:10)
 

в базе данных

  Ответить  
 
 автор: dirol   (13.02.2009 в 16:47)   письмо автору
 
   для: dirol   (13.02.2009 в 16:15)
 

вообщем у меня из базы данных выводится список городов вот так

Австрия (AT)
Азербайджан (AZ)
Алжир (DZ)
Ангола (AO)
Армения (AM)
Афганистан (AF)
Бангладеш (BD)
Беларусь (BY)
Бельгия (BE)
Бенин (BJ)
Болгария (BG)
Босния и Герцеговина (BA)
Ботсвана (BW)
Буркина-Фасо (BF)
Бурунди (BI)
Великобритания (GB)
Вьетнам (VN)
Габон (GA)
Гвинея (GN)
Германия (DE)
Голландия (NL)
Гренландия (GL)
Греция (GR)


а хотелось бы так

А
Австрия (AT)
Азербайджан (AZ)
Алжир (DZ)
Ангола (AO)
Армения (AM)
Афганистан (AF)

Б

Бангладеш (BD)
Беларусь (BY)
Бельгия (BE)
Бенин (BJ)
Болгария (BG)
Босния и Герцеговина (BA)
Ботсвана (BW)
Буркина-Фасо (BF)
Бурунди (BI)

B

Великобритания (GB)
Вьетнам (VN)

Г

Габон (GA)
Гвинея (GN)
Германия (DE)
Голландия (NL)
Гренландия (GL)
Греция (GR)


вот как такое сделать

  Ответить  
 
 автор: axxil   (13.02.2009 в 17:04)   письмо автору
 
   для: dirol   (13.02.2009 в 16:47)
 

Прям по ходу вывода стран из массива и выставлять буквы:
<?
  $countries 
getCountries(); // Получаем массив со странами
  
$current_first_symb 'A';
  
$prev_first_symb 'A';
  echo 
"A<ul>";
  for(
$i=0;$i<count($countries);$i++){
     if(
$i 0){
       
$current_first_symb substr($countries[$i],0,1);
       
$prev_first_symb substr($countries[$i-1],0,1);
     }
     if(
$current_first_symb != $prev_first_symb){
        echo 
'</ul>'.$current_first_symb.'<ul>';
     }
     echo 
'<li>'.$countries[$i].'</li>';
  }
  echo 
'</ul>';
?>


PS. Для оптимизации, можно не определять постоянно предыдущий первый символ, а хранить последнюю смену и сравнивать с ним.

  Ответить  
 
 автор: dirol   (13.02.2009 в 17:13)   письмо автору
 
   для: axxil   (13.02.2009 в 17:04)
 

а под базу как сделать подскажи пожалуйста.


  $result = $db->sql_query("SELECT id, iso2, iso3, name FROM weather_country ORDER BY name");
  while (list($id, $iso2, $iso3, $name) = $db->sql_fetchrow($result)) {

            echo "<a href="">".$name."</a> ($iso2)<br />\n";


          }

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 17:27)   письмо автору
 
   для: dirol   (13.02.2009 в 17:13)
 

<?
$result 
$db->sql_query("SELECT id, iso2, iso3, name FROM weather_country ORDER BY name"); 
while (list(
$id$iso2$iso3$name) = $db->sql_fetchrow($result)) {
    
$towns[] = $name;
    
$temps[] = $iso2;
}

foreach(
$towns as $key => $names){ 
    
$firstletter[$key] = substr($names01); 

$var ''
foreach(
$towns as $key => $value){ 
    if(
$var != $firstletter[$key]) echo 'Буква: '.$firstletter[$key].'<br />'
    
$var $firstletter[$key]; 
    echo 
'<a href="">'.$value.'</a> ('.$temps[$key].')'."<br />\n"
}

  Ответить  
 
 автор: Axxil   (13.02.2009 в 17:47)   письмо автору
 
   для: nikita2206   (13.02.2009 в 17:27)
 

Зачем делать 3 цикла, когда можно спокойно одним обойтись?

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 17:51)   письмо автору
 
   для: Axxil   (13.02.2009 в 17:47)
 

потомучто у меня похмелье.... кстати ваше решение длинее и непонятнее...

  Ответить  
 
 автор: Axxil   (13.02.2009 в 17:54)   письмо автору
 
   для: nikita2206   (13.02.2009 в 17:51)
 

> кстати ваше решение длинее и непонятнее...

[в ужасе убежал учиться]

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 17:57)   письмо автору
 
   для: Axxil   (13.02.2009 в 17:54)
 

мда

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 18:56)   письмо автору
 
   для: Axxil   (13.02.2009 в 17:47)
 

Вот вам один и всё коротко и ясно....

<?
$result 
$db->sql_query("SELECT id, iso2, iso3, name FROM weather_country ORDER BY name");
$var '';
while (list(
$id$iso2$iso3$name) = $db->sql_fetchrow($result)) {
    if(
$var != $name{0}) echo '<br />Буква: '.$name{0}.'<br />';
    
$var $name{0};
    echo 
'<a href="'.$id.'">'.$name.'</a> ('.$iso2.')'."<br />\n";
}

  Ответить  
 
 автор: Trianon   (13.02.2009 в 19:02)   письмо автору
 
   для: nikita2206   (13.02.2009 в 18:56)
 

(07.04.2006 в 14:17)

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 19:09)   письмо автору
 
   для: Trianon   (13.02.2009 в 19:02)
 

у меня голова болит читать, скажите пож-ста в чем суть? как я мельком разглядел в 6 версии {} будут использоватся для инициализации массивов??

  Ответить  
 
 автор: BinLaden   (13.02.2009 в 19:11)   письмо автору
 
   для: nikita2206   (13.02.2009 в 19:09)
 

Наборот, вообще снесут эту штуку.

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 19:14)   письмо автору
 
   для: BinLaden   (13.02.2009 в 19:11)
 

понял:
<? 
$result 
$db->sql_query("SELECT id, iso2, iso3, name FROM weather_country ORDER BY name"); 
$var ''
while (list(
$id$iso2$iso3$name) = $db->sql_fetchrow($result)) { 
    if(
$var != $name[,1]) echo '<br />Буква: '.$name[,1].'<br />'
    
$var $name[,1]; 
    echo 
'<a href="'.$id.'">'.$name.'</a> ('.$iso2.')'."<br />\n"
}

както так...

  Ответить  
 
 автор: dirol   (13.02.2009 в 19:40)   письмо автору
 
   для: nikita2206   (13.02.2009 в 19:14)
 

выбрал в итоге этот вариант)) спасибо

  Ответить  
 
 автор: Axxil   (13.02.2009 в 17:50)   письмо автору
 
   для: dirol   (13.02.2009 в 17:13)
 

<?
  $result 
$db->sql_query("SELECT id, iso2, iso3, name FROM weather_country ORDER BY name"); 
  
$current_first_symb 'A';
  
$last_first_symb 'A';
  echo 
"A<ul>";
  while (
$country $db->sql_fetchrow($result)) { 
     
$current_first_symb substr($country[3],0,1);

     if(
$current_first_symb != $last_first_symb){
        echo 
'</ul>'.$current_first_symb.'<ul>';
        
$last_first_symb $current_first_symb;
     }
     echo 
'<li>'.$country[3].'</li>';
  }
  echo 
'</ul>';
?> 

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 17:12)   письмо автору
 
   для: dirol   (13.02.2009 в 16:47)
 

при помощи циклов сделайте два массива, при этом чтобы в первом хранились города, а во втором буква каждого...
примерно так:

<?
$towns 
= <<<towns
Австрия (AT)
Азербайджан (AZ)
Алжир (DZ)
Ангола (AO)
Армения (AM)
Афганистан (AF)
Бангладеш (BD)
Беларусь (BY)
Бельгия (BE)
Бенин (BJ)
Болгария (BG)
Босния и Герцеговина (BA)
Ботсвана (BW)
Буркина-Фасо (BF)
Бурунди (BI)
Великобритания (GB)
Вьетнам (VN)
Габон (GA)
Гвинея (GN)
Германия (DE)
Голландия (NL)
Гренландия (GL)
Греция (GR)
towns;

$towns explode("\n"$towns);

foreach(
$towns as $key => $names){
    
$firstletter[$key] = substr($names01);
}
$var '';
foreach(
$towns as $key => $value){
    if(
$var != $firstletter[$key]) echo 'Буква: '.$firstletter[$key].'<br />';
    
$var $firstletter[$key];
    echo 
'Город: '.$value.'.'."\r\n<br /><br />";
}

  Ответить  
 
 автор: dirol   (13.02.2009 в 17:31)   письмо автору
 
   для: nikita2206   (13.02.2009 в 17:12)
 

спасибо всем!

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 17:49)   письмо автору
 
   для: dirol   (13.02.2009 в 17:31)
 

<? 
$result 
$db->sql_query("SELECT id, iso2, iso3, name FROM weather_country ORDER BY name");  
while (list(
$id$iso2$iso3$name) = $db->sql_fetchrow($result)) { 
    
$towns[] = $name
    
$temps[] = $iso2;
    
$ids[] = $id;


foreach(
$towns as $key => $names){  
    
$firstletter[$key] = substr($names01);  
}  
$var '';  
foreach(
$towns as $key => $value){  
    if(
$var != $firstletter[$key]) echo 'Буква: '.$firstletter[$key].'<br />';  
    
$var $firstletter[$key];  
    echo 
'<a href="'.$ids[$key].'">'.$value.'</a> ('.$temps[$key].')'."<br />\n";  
}

  Ответить  
 
 автор: а-я   (13.02.2009 в 18:01)   письмо автору
 
   для: dirol   (13.02.2009 в 11:21)
 

наверно лучше начать с :


SELECT
 LEFT(`name`,1) as `letter`,
 GROUP_CONCAT(`name`) as `names`
FROM
 `tbl`
GROUP BY `letter`


или сразу с переносом сделать

SELECT
 LEFT(`name`,1) as `letter`,
 GROUP_CONCAT(`name` SEPARATOR"<br />") as `names`
FROM
 `tbl`
GROUP BY `letter`

  Ответить  
 
 автор: а-я   (13.02.2009 в 18:32)   письмо автору
 
   для: а-я   (13.02.2009 в 18:01)
 

=) не знаю, здраво ли я мыслю.
но я так сделал:

<?
$_SQL 
'
SELECT
 LEFT(`name`,1) as `letter`, 
 GROUP_CONCAT(CONCAT("<a href=\"./?id=",`id`,"\">",`name`,"</a> (", `iso2`,")<br />") SEPARATOR"") 
FROM 
 `weather_country` 
GROUP BY `letter`
'
;

$result $db->sql_query($_SQL);
 while(list(
$letter,$countryes) = $db->sql_fetchrow($result)){
 echo 
$letter.'<br />';
 echo 
$countryes.'<br />';
 }
?>


не нашел для чего Вам $iso3 и $id

  Ответить  
 
 автор: Trianon   (13.02.2009 в 18:40)   письмо автору
 
   для: а-я   (13.02.2009 в 18:32)
 

по большому счету, и группирующий запрос и собственно GROUP_CONCAT здесь притянуты за уши.
Особой экономии они не дают, а ограничения накладывают.
К тому же, так конкатенировать текст с тегами просто нельзя - фаза htmlspecialchars оказывается выкинутой. Если в именах будет какая фигня - ой.

Короче - здесь - овчинка выделки не стоит.

  Ответить  
 
 автор: а-я   (13.02.2009 в 18:51)   письмо автору
 
   для: Trianon   (13.02.2009 в 18:40)
 

=) да, на счет этого тож думал.
но не думаю, что так все печально для название страны и погоды.

  Ответить  
 
 автор: BinLaden   (13.02.2009 в 19:00)   письмо автору
 
   для: а-я   (13.02.2009 в 18:51)
 

> не думаю

И так -- постоянно! :)

  Ответить  
 
 автор: dirol   (13.02.2009 в 19:27)   письмо автору
 
   для: BinLaden   (13.02.2009 в 19:00)
 

static $massiv;
           if (!is_array($massiv)) {
           $result = $db->sql_query("SELECT id, iso2, iso3, name FROM weather_country");
           while (list($id, $iso2, $iso3, $name) = $db->sql_fetchrow($result)) $massiv[] = array($id, $iso2, $iso3, $name);
          }

           if ($massiv) {
            foreach ($massiv as $key => $val) {
             $firstletter[$key] = substr($val[3], 0, 1);
             $nom[$key]=$val[0];
                  }
               }

            $var = "";
            foreach($massiv as $key => $value){
            if($var != $firstletter[$key]) echo "Буква: ".$firstletter[$key]."<br />";
            $var = $firstletter[$key];
            echo "Город: <a href=".$nom[$key].">".$value[3]."</a><br /><br />";
            }


я вот так сделал.

так какой из предложеных вариантов лучше? меньше ресурсоемкий?

  Ответить  
 
 автор: nikita2206   (13.02.2009 в 19:33)   письмо автору
 
   для: dirol   (13.02.2009 в 19:27)
 

ждем ответа Трианона)
П.С. я незнаю на чем вы код пишите, может на дримвейвере или еще чем, я вас умоляю, скачайте себе еклипс или зенд иде.....а то отступы вы в непонятных местах както делаете....

  Ответить  
 
 автор: Trianon   (13.02.2009 в 19:40)   письмо автору
 
   для: nikita2206   (13.02.2009 в 19:33)
 

а чо я?

Три цикла вместо одного , полное дублирование результата запроса в памяти...
Что мне тут смотреть?

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

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

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