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

Форум PHP

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

 

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

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

тема: Сформировать из двумерного массива список
 
 автор: admiral   (04.07.2013 в 02:44)   письмо автору
1.5 Кб
 
 

Ребят, может это и реально просто, но я запарился, видимо нужен отдых.
Иммеется двумерный массив (во вложении файл array.txt), нужно его обойтии на выходе получить html список (вложение list.txt)
Т.е. по сути это обычныесписки где каждый список начинается в алфавитном парядке по возврастанию. Сложность в том что эти списки нужно разделить на четыре контейнера (<div class="sec-sep">), т.е. 4 столбца.
Если поможете готовым кодом будуочень рад, так сроки горят, зациклился на этом капец, даже готов финансово отблагодарить, ну или хотя бы намекните как правильно поступить.
Вот мой код, правда не очень грамотный.
<?
$cnt 
count($letters,COUNT_RECURSIVE);  /// $letters - это готовый упорядоченный по алфавиту массив
    
$count count($letters);
    
$ceil =  round($cnt/4);     
    
$pp 0;      
    
$pp_cur_cnt 0;
    echo 
'<div class="sections">';
    foreach(
$letters AS $ul => $li) { 
    
            for(
$q=0;$q<=$count;$q++):
            
            
$pp $pp+1
            
            
$cur_ul $ul;
            
//$new_ul = "";
            
            
if($pp == 1)    echo '<div class="sec-sep">';  
                  
                
                if(
$cur_ul!=$new_ul) {
                    
                        echo 
'<ul>';  
                        
$cur_cnt =  count($letters[$ul]);
                        echo 
'<li class="header">'.mb_strtoupper($cur_ul).'-'.$cur_cnt.'</li>';    
                        if(!empty(
$letters[$ul][$q])) echo '<li><a href="">'.$letters[$ul][$q].'</a></li>';
                        
$new_ul $cur_ul;
                }   
                else {
                    if(!empty(
$letters[$ul][$q])) echo '<li><a href="">'.$letters[$ul][$q].'</a></li>'
                     
$pp_cur_cnt $pp_cur_cnt+1
                    if(
$pp_cur_cnt == $cur_cnt) {
                        echo 
'</ul>';
                        
$pp_cur_cnt 0;
                    }    
                }
                  
                        
                    
            if(
$pp == 5) {
                echo 
'</div>';  
                
$pp=0;
            }
                    
            
            endfor;
                         
                    
    } 
    echo 
'</div>'?>

  Ответить  
 
 автор: DangerBay   (04.07.2013 в 08:14)   письмо автору
 
   для: admiral   (04.07.2013 в 02:44)
 

<?php
echo '<div class="sections">' PHP_EOL;

$c count($lettersCOUNT_RECURSIVE);
$div round($c/4);
$ct 0;

while (list(
$letter$arr) = each($letters)) {
    if(
$ct $div == 0) { 
        if(
$ct+$div >= $c) echo '<div class="sec-sep last"><ul>' PHP_EOL;
           else echo 
'<div class="sec-sep"><ul>' PHP_EOL;
       }
    else echo 
'<ul>' PHP_EOL;
    
    echo 
'<li class="header">' mb_strtoupper($letter). '</li>' PHP_EOL;
    
    
$ct++;
     
    foreach(
$arr as $value) {
        if(
$ct $div == 0) echo '</ul></div>' PHP_EOL '<div class="sec-sep"><ul>' PHP_EOL;
        echo 
'<li><a href="../../index.html">' $value '</a></li>' PHP_EOL;
        
$ct++;
    }
    
    echo 
'</ul>' PHP_EOL;
    if(
$ct $div == 0) echo '</div>' PHP_EOL;
}

echo 
'</div>';

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

  Ответить  
 
 автор: confirm   (04.07.2013 в 09:22)   письмо автору
 
   для: DangerBay   (04.07.2013 в 08:14)
 

Зачем для html PHP_EOL?

  Ответить  
 
 автор: admiral   (04.07.2013 в 12:31)   письмо автору
 
   для: confirm   (04.07.2013 в 09:22)
 

Пологаю чтобы исходный html-код было удобнее просматривать.

  Ответить  
 
 автор: confirm   (04.07.2013 в 12:46)   письмо автору
 
   для: admiral   (04.07.2013 в 12:31)
 

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

  Ответить  
 
 автор: admiral   (04.07.2013 в 16:22)   письмо автору
 
   для: confirm   (04.07.2013 в 12:46)
 

Вчемже плохо что я лишь предположил? Я тоже пользуюсь отладчиком, но вы спросили автора зачем, автор не ответил, я выдвинул предположение. Автор написал код, как образец, чтобы я не тупо скопипастил, а изучил его.
Пока что его вариант мне очень подошел, есть проблема если слишком большой (напрмиер у буквы И), то он идет до конца и не переносится, но это попробую исправить

  Ответить  
 
 автор: DangerBay   (04.07.2013 в 16:46)   письмо автору
3.1 Кб
 
   для: admiral   (04.07.2013 в 16:22)
 

Странно что не переносит, за это отвечает строчка
if($ct % $div == 0) echo '</ul></div>' . chr(10) . '<div class="sec-sep"><ul>' . chr(10);

Прикрепил пример если что, всё нормально работает у меня.

  Ответить  
 
 автор: admiral   (04.07.2013 в 16:52)   письмо автору
 
   для: DangerBay   (04.07.2013 в 16:46)
 

Да все ок. Список просто залазил за футер, вот мне и показалось, посмотрел исходник там все ок, поправил стили. Спасибо большое! Буду дальше разбираться.

  Ответить  
 
 автор: DangerBay   (04.07.2013 в 16:51)   письмо автору
 
   для: confirm   (04.07.2013 в 09:22)
 

Вставил просто чтоб видеть где открываются и закрываются тэги. На практике у меня на уровне шаблонизатора всегда удаляются все лишние переносы строк. Весь html-код в одну строчку выходит.

  Ответить  
 
 автор: confirm   (04.07.2013 в 09:26)   письмо автору
 
   для: admiral   (04.07.2013 в 02:44)
 

>списки нужно разделить на четыре контейнера (<div class="sec-sep">), т.е. 4 столбца.

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

  Ответить  
 
 автор: admiral   (04.07.2013 в 12:26)   письмо автору
 
   для: confirm   (04.07.2013 в 09:26)
 

>>списки нужно разделить на четыре контейнера (<div class="sec-sep">), т.е. 4 столбца.
>
>И как в вашем примере готового списка это правило подтверждено? Второй div имеет два списка.

>Зачем вы создаете ключи (а, б, в, г...), если они вам не нужны, вы их не используете?
Это алфавит, т.е. у меня будет такой алфавитный рубрикатор.
>Из каких данных берутся параметры для ссылок?
Хороший вопрос, я нужно было в массив еще занести ID, спасибо что напомнили, учту.

Вообщем-то мне нужно сделать примерно как тут http://www.gemotest.ru/analysis/catalog/direction/
Только у меня не 5 столбцов, а 4.
<div class="sec-sep"> - данный контейнер это и есть сторлбец, их должно быть 4, а спимсков может быть и 2 и 3, т.е. сам список это массив элементов каждой буквы алфавита.
Поэтому как я пологаю чтобы вывести 4 стоблца с одинаковым кол-ом элементов на каждый стоблец(исключение последний столбец) нужно посчитать общее кол-во элементов (у меня их пока 46 в базе) и поделить на 4, и округлить. Получаем 15.
Такой логике я следовал, но где-то сделал неправильно, либо вообще мой алгоритм выкинуть.

  Ответить  
 
 автор: confirm   (04.07.2013 в 12:36)   письмо автору
 
   для: admiral   (04.07.2013 в 12:26)
 

>Это алфавит, т.е. у меня будет такой алфавитный рубрикатор.

И какой же в нем смысл, если вы принудительно разбиваете вывод не по нему, а по 4 списка?

Для того, чтобы выводить по 4, делить, округлять и бог, что еще делать, нет никакой необходимости, достаточно исходный массив разбить на 4 - $array = array_chunk($array, 4), и сделать вывод содержимого в цикле.

Прописывать имя класса каждому элементу LI тоже нет необходимости, коли они у вас все имеют один и тот же класс, то гораздо выгоднее прописать в стилях:
.sec-sep li { стили }

  Ответить  
 
 автор: admiral   (04.07.2013 в 14:19)   письмо автору
 
   для: confirm   (04.07.2013 в 12:36)
 

Спасибо, здравая идея, попробую, если что отпишусь!

  Ответить  
 
 автор: confirm   (04.07.2013 в 14:44)   письмо автору
 
   для: admiral   (04.07.2013 в 14:19)
 

Здравая идея:

1) если ваш массив, это результат выборки из базы, то в нем нет никакой необходимости, нужно сразу выводить ресурс без всякого промежуточного массива.

2) если нужны 4 колонки под каждой литерой, то разбивать массив (если все таки используется промежуточный массив) никак не вяжется с требуемым.

3) вообще разбивать что либо на части нет никакого смысла, существуют стили

Пусть $q, это ресурс полученный запросом, тогда while($r = mysql_fetch_assoc($q)) { вывод }. В примере же показан массив, для наглядности:
<?
$array 
= array(
    array(
'id'=>1,'name'=>'Анализ крови общий'), 
    array(
'id'=>2,'name'=>'Анализы на гепатит'), 
    array(
'id'=>3,'name'=>'Анализы на гепатит'),
    array(
'id'=>4,'name'=>'Биохимия'), 
    array(
'id'=>5,'name'=>'Биохимия мочи'),
    array(
'id'=>6,'name'=>'Витамины'),
    array(
'id'=>7,'name'=>'Гемостаз'), 
    array(
'id'=>8,'name'=>'Генетические исследования (гены)'), 
    array(
'id'=>9,'name'=>'Генетические исследования (комплексы)'), 
    array(
'id'=>10,'name'=>'Гистология'), 
    array(
'id'=>11,'name'=>'Гормоны (кровь)'),
    array(
'id'=>12,'name'=>'Диагностика анемий'), 
    array(
'id'=>13,'name'=>'Диагностика аутоиммунных и системных заболеваний'),
    array(
'id'=>14,'name'=>'Иммуногематология'), 
    array(
'id'=>15,'name'=>'Иммунология'), 
    array(
'id'=>16,'name'=>'Иммунология. Чувствительность к иммуномодуляторам'),
    array(
'id'=>17,'name'=>'Иммунология. Чувствительность к индукторам интерферона'), 
    array(
'id'=>18,'name'=>'Иммунология. Чувствительность к препаратам интерферона'),
    array(
'id'=>19,'name'=>'Индивидуальные аллергены (комплексы)'), 
    array(
'id'=>20,'name'=>'Индивидуальные аллергены. Аллергены грибковые'),
    array(
'id'=>21,'name'=>'Индивидуальные аллергены. Аллергены деревьев'), 
    array(
'id'=>22,'name'=>'Индивидуальные аллергены. Аллергены животных'),
    array(
'id'=>23,'name'=>'Индивидуальные аллергены. Аллергены клещевые'), 
    array(
'id'=>24,'name'=>'Индивидуальные аллергены. Аллергены трав'),
    array(
'id'=>25,'name'=>'Индивидуальные аллергены. Бактериальные аллергены'), 
    array(
'id'=>26,'name'=>'Индивидуальные аллергены. Пищевые аллергены'),
    array(
'id'=>27,'name'=>'Исследование слюны'), 
    array(
'id'=>28,'name'=>'Исследование спермы'), 
    array(
'id'=>29,'name'=>'Исследования кала'), 
    array(
'id'=>30,'name'=>'Исследования мочи'), 
    array(
'id'=>31,'name'=>'Исследования мочи на гормоны'),
    array(
'id'=>32,'name'=>'Кардиомаркеры'),
    array(
'id'=>33,'name'=>'Микробиологические исследования'), 
    array(
'id'=>34,'name'=>'Микроскопические исследования'), 
    array(
'id'=>35,'name'=>'Минеральный обмен'),
    array(
'id'=>36,'name'=>'Онкомаркеры'),
    array(
'id'=>37,'name'=>'Панели аллергенов (скрининг)'), 
    array(
'id'=>38,'name'=>'ПЦР-диагностика'),
    array(
'id'=>39,'name'=>'Серология'),
    array(
'id'=>40,'name'=>'Тесты на отцовство для суда (генетика)'), 
    array(
'id'=>41,'name'=>'Тесты на отцовство информационные (генетика)'),
    array(
'id'=>42,'name'=>'Типирование генов HLA'), 
    array(
'id'=>43,'name'=>'Токсикологические исследования'),
    array(
'id'=>44,'name'=>'Функциональные пробы'),
    array(
'id'=>44,'name'=>'Цитогенетические исследования'), 
    array(
'id'=>45,'name'=>'Цитология')
);
$head null;
$list '<div class="sections"><ul>';
foreach(
$array as $v) {
    if(
$head!=$v['name'][0]) {
        
$list .= '<li class=head>'.$v['name'][0].'</li>';
        
$head $v['name'][0];
    } 
    
$list .= '<li><a href=?p='.$v['id'].'>'.$v['name'].'</a></li>';
}
$list .= '</ul></div>';
?>
<style>
.sections ul {
    list-style:none;
}
.head {
    width: 100% !important;
    font-weight: bold;
}
.sections ul li {
    display: inline-block;
    width: 24%;
    margin-right: 1%;
}
</style>
<?=$list?>
Все остальное далеко от здравого смысла, и имеет место быть только в том случае, если условия вывода более сложны.

  Ответить  
 
 автор: admiral   (04.07.2013 в 15:49)   письмо автору
 
   для: confirm   (04.07.2013 в 14:44)
 

Так я тоже в самом начале и поступил. Но мне нужно по такому принципу - http://www.gemotest.ru/analysis/catalog/direction/
Увас наоборот, по горизонтали.

  Ответить  
 
 автор: confirm   (04.07.2013 в 16:19)   письмо автору
 
   для: admiral   (04.07.2013 в 15:49)
 

А вы внимательно просмотрели код представленный мной? Какой стиль списку установлен? А что будет, если стиль установить по умолчанию - inline?

  Ответить  
 
 автор: admiral   (04.07.2013 в 16:35)   письмо автору
 
   для: confirm   (04.07.2013 в 16:19)
 

Имеете ввиду списку ul поставить display:inline?

  Ответить  
 
 автор: confirm   (04.07.2013 в 17:16)   письмо автору
 
   для: admiral   (04.07.2013 в 16:35)
 

Нет, блочными элементами они и должны остаться, но родители. Нужно изменить немного стиль, и изменить вывод (уже деля на четыре секции)?
.sections {rn    display: inline-block;rn    padding: 0;rn    width: 24%;rn    margin-right: 1%;rn    list-style:none;rn    vertical-align: top;rn}rn.head {rn    font-weight: bold;rn}rn<?rn$head null;rn$part 4;rn$ul 0;rn$list '<div><ul class="sections">';rnforeach($array as $v) {rn    if($head!=$v['name'][0]) {rn        if($ul && !($ul $part)) $list .= '</ul><ul class="sections">';rn        $list .= '<li class=head>'.$v['name'][0].'</li>';rn        $head $v['name'][0];rn        $ul++;rn    rn    $list .= '<li><a href=?p='.$v['id'].'>'.$v['name'].'</a></li>';rn}rn$list .= '</ul></div>';

  Ответить  
 
 автор: admiral   (04.07.2013 в 17:19)   письмо автору
 
   для: confirm   (04.07.2013 в 17:16)
 

у вас код плохо читабельный, используйте табуляцию

  Ответить  
 
 автор: confirm   (04.07.2013 в 17:20)   письмо автору
 
   для: admiral   (04.07.2013 в 17:19)
 

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

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

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