|
 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>'; ?>
|
| |
|
|
|
|
|
|
|
для: admiral
(04.07.2013 в 02:44)
| |
<?php
echo '<div class="sections">' . PHP_EOL;
$c = count($letters, COUNT_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 его сначала, например, потом выкладывать | |
|
|
|
|
|
|
|
для: DangerBay
(04.07.2013 в 08:14)
| | Зачем для html PHP_EOL? | |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 09:22)
| | Пологаю чтобы исходный html-код было удобнее просматривать. | |
|
|
|
|
|
|
|
для: admiral
(04.07.2013 в 12:31)
| | Очень плохо, что вы так полагаете - сейчас каждый уважающий себя браузер имеет отладчик, в котором вы без проблем увидите структуру html-кода. А вот слать пользователю лишние один/два байта после каждого тега, которые для html являются мусором, это не есть хорошо. | |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 12: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);
|
Прикрепил пример если что, всё нормально работает у меня. | |
|
|
|
|
|
|
|
для: DangerBay
(04.07.2013 в 16:46)
| | Да все ок. Список просто залазил за футер, вот мне и показалось, посмотрел исходник там все ок, поправил стили. Спасибо большое! Буду дальше разбираться. | |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 09:22)
| | Вставил просто чтоб видеть где открываются и закрываются тэги. На практике у меня на уровне шаблонизатора всегда удаляются все лишние переносы строк. Весь html-код в одну строчку выходит. | |
|
|
|
|
|
|
|
для: admiral
(04.07.2013 в 02:44)
| | >списки нужно разделить на четыре контейнера (<div class="sec-sep">), т.е. 4 столбца.
И как в вашем примере готового списка это правило подтверждено? Второй div имеет два списка.
Зачем вы создаете ключи (а, б, в, г...), если они вам не нужны, вы их не используете?
Из каких данных берутся параметры для ссылок? | |
|
|
|
|
|
|
|
для: 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.
Такой логике я следовал, но где-то сделал неправильно, либо вообще мой алгоритм выкинуть. | |
|
|
|
|
|
|
|
для: admiral
(04.07.2013 в 12:26)
| | >Это алфавит, т.е. у меня будет такой алфавитный рубрикатор.
И какой же в нем смысл, если вы принудительно разбиваете вывод не по нему, а по 4 списка?
Для того, чтобы выводить по 4, делить, округлять и бог, что еще делать, нет никакой необходимости, достаточно исходный массив разбить на 4 - $array = array_chunk($array, 4), и сделать вывод содержимого в цикле.
Прописывать имя класса каждому элементу LI тоже нет необходимости, коли они у вас все имеют один и тот же класс, то гораздо выгоднее прописать в стилях:
| |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 12:36)
| | Спасибо, здравая идея, попробую, если что отпишусь! | |
|
|
|
|
|
|
|
для: 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?>
| Все остальное далеко от здравого смысла, и имеет место быть только в том случае, если условия вывода более сложны. | |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 14:44)
| | Так я тоже в самом начале и поступил. Но мне нужно по такому принципу - http://www.gemotest.ru/analysis/catalog/direction/
Увас наоборот, по горизонтали. | |
|
|
|
|
|
|
|
для: admiral
(04.07.2013 в 15:49)
| | А вы внимательно просмотрели код представленный мной? Какой стиль списку установлен? А что будет, если стиль установить по умолчанию - inline? | |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 16:19)
| | Имеете ввиду списку ul поставить display:inline? | |
|
|
|
|
|
|
|
для: 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>';
|
| |
|
|
|
|
|
|
|
для: confirm
(04.07.2013 в 17:16)
| | у вас код плохо читабельный, используйте табуляцию | |
|
|
|
|
|
|
|
для: admiral
(04.07.2013 в 17:19)
| | Надо было не торопиться отвечать на него, теперь не поправить уже. Это косячит скрипт форума, возвращая такими сообщения при редактировании. | |
|
|
|
|