|
|
|
| Добрый день! Помогите, пожалуйста, с задачей: у меня компонент есть Битрикса, который формирует список новостей такой структурой:
<ul>
<li>
<a href="#"></a>
</li>
<ul>
|
Т.е. на выходе получаем по типу:
<ul>
<li>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
</li>
<ul>
|
А мне нужно разбить эти новости по 3 тегом <li> и на выходе получить:
<ul>
<li>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
</li>
<li>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
</li>
<li>
<a href="#"></a>
</li>
<ul>
|
Что я имею: переменную $count содержащую общее количество новостей и переменную $limit содержащую просто число 3, так же создал переменную $res содержащую (ceil($count/$limit)) - количество новостей делим на 3 и округляем в меньшую сторону - это количество "страниц", т.е. сколько будет разделений <li>, в данном примере это число 3. Так вот, теперь никак не могу додуматься до главного, как написать условие или цикл, чтобы происходило само разбиение... Помогите, пожалуйста) | |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 10:48)
| |
<?
$a = array(
'<a href="#">1</a>',
'<a href="#">2</a>',
'<a href="#">3</a>',
'<a href="#">4</a>',
'<a href="#">5</a>',
'<a href="#">6</a>',
'<a href="#">7</a>',
'<a href="#">8</a>',
'<a href="#">9</a>',
'<a href="#">10</a>',
'<a href="#">11</a>'
);
$a = array_chunk($a, 3);
$a = array_map('implode', $a);
$a = '<ul><li>' . implode('</li><li>', $a) . '</li></ul>';
echo $a;
|
| |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 11:01)
| | confirm, спасибо! А если без массива, можно реализовать? Просто внутри этих ссылок ещё по 50 строчек кода, проблемно будет я думаю) | |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 11:05)
| | Что значит без массива, а откуда же вы эти данные берете?
Если это вывод данных из базы, значит установите счетчик итераций цикла и делите его по модулю 3 тогда. | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 11:08)
| | Мм, наверное да из массива, в общем сейчас, если в кратце, код выглядит так:
<?
$count = count($arResult["ITEMS"]);
$limit = 3;
$res = ceil($count/$limit);
?>
<ul>
<li>
<?foreach($arResult["ITEMS"] as $arItem):?>
<a class="news-item" href="<?=$arItem["DETAIL_PAGE_URL"]?>">
{МНОГО_КОДА}
</a>
<?endforeach;?>
</li>
</ul>
|
| |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 11:11)
| | Покажите часть этого массива, элементов 5-7 хватит. | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 11:14)
| |
<?
Array
(
[0] => Array
(
[ID] => 25971
[NAME] => Новость 1
[DETAIL_PAGE_URL] => /news/25971/
[DETAIL_TEXT] => Описание 1 новости
...
)
[1] => Array
(
[ID] => 25972
[NAME] => Новость 2
[DETAIL_PAGE_URL] => /news/25972/
[DETAIL_TEXT] => Описание 2 новости
...
)
[2] => Array
(
[ID] => 25973
[NAME] => Новость 3
[DETAIL_PAGE_URL] => /news/25973/
[DETAIL_TEXT] => Описание 3 новости
...
)
...
)
?>
|
| |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 11:18)
| |
<?
$a = array(
array(
'ID' => 25971,
'NAME' => 'Новость 1',
'DETAIL_PAGE_URL' => '/news/25971/',
'DETAIL_TEXT' => 'Описание 1 новости'
),
array(
'ID' => 25972,
'NAME' => 'Новость 2',
'DETAIL_PAGE_URL' => '/news/25972/',
'DETAIL_TEXT' => 'Описание 2 новости'
),
array(
'ID' => 25973,
'NAME' => 'Новость 3',
'DETAIL_PAGE_URL' => '/news/25973/',
'DETAIL_TEXT' => 'Описание 3 новости'
),
array(
'ID' => 25974,
'NAME' => 'Новость 4',
'DETAIL_PAGE_URL' => '/news/25974/',
'DETAIL_TEXT' => 'Описание 4 новости'
),
array(
'ID' => 25975,
'NAME' => 'Новость 5',
'DETAIL_PAGE_URL' => '/news/25975/',
'DETAIL_TEXT' => 'Описание 5 новости'
)
);
$ul = '<ul><li>' . implode('</li><li>', array_map('implode', array_chunk(array_map(function($v) {
return '<a class="news-item" href="' . $v['DETAIL_PAGE_URL'] . '">'. $v['NAME'] . '</a><br>';
}, $a), 3))) . '</li></ul>';
echo $ul;
|
Или как писал выше - счетчик итерации (для цикла for он уже есть) и деление по модулю.
Не знаю что такое {много кода} и что там должно быть, из предположения должно быть название ссылки, так что...
BR для наглядности, а в реалии он не нужен, все можно с помощью CSS сделать. | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 11:40)
| | Много кода, это много кода))
<ul>
<li>
<?foreach($arResult["ITEMS"] as $arItem):?>
<?
$this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT"));
$this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
?>
<a class="news-item" href="<?=$arItem["DETAIL_PAGE_URL"]?>">
<div class="news-item-inner">
<?if($arParams["DISPLAY_PICTURE"]!="N" && is_array($arItem["PREVIEW_PICTURE"])):?>
<?if(!$arParams["HIDE_LINK_WHEN_NO_DETAIL"] || ($arItem["DETAIL_TEXT"] && $arResult["USER_HAVE_ACCESS"])):?>
<div class="news-item-photo"><img class="preview_picture" border="0" src="<?=$arItem["PREVIEW_PICTURE"]["SRC"]?>" width="<?=$arItem["PREVIEW_PICTURE"]["WIDTH"]?>" height="<?=$arItem["PREVIEW_PICTURE"]["HEIGHT"]?>" alt="<?=$arItem["NAME"]?>" title="<?=$arItem["NAME"]?>" style="float:left" /></div>
<?else:?>
<img class="preview_picture" border="0" src="<?=$arItem["PREVIEW_PICTURE"]["SRC"]?>" width="<?=$arItem["PREVIEW_PICTURE"]["WIDTH"]?>" height="<?=$arItem["PREVIEW_PICTURE"]["HEIGHT"]?>" alt="<?=$arItem["NAME"]?>" title="<?=$arItem["NAME"]?>" style="float:left" />
<?endif;?>
<?endif?>
<div class="news-item-text">
<?if($arParams["DISPLAY_DATE"]!="N" && $arItem["DISPLAY_ACTIVE_FROM"]):?>
<span class="news-date-time"><?echo $arItem["DISPLAY_ACTIVE_FROM"]?></span>
<?endif?>
<?if($arParams["DISPLAY_NAME"]!="N" && $arItem["NAME"]):?>
<?if(!$arParams["HIDE_LINK_WHEN_NO_DETAIL"] || ($arItem["DETAIL_TEXT"] && $arResult["USER_HAVE_ACCESS"])):?>
<div class="news-item-title"><?echo $arItem["NAME"]?></div>
<?else:?>
<div class="news-item-title"><?echo $arItem["NAME"]?></div>
<?endif;?>
<?endif;?>
<?if($arParams["DISPLAY_PREVIEW_TEXT"]!="N" && $arItem["PREVIEW_TEXT"]):?>
<div class="news-item-descr"><?echo $arItem["PREVIEW_TEXT"];?></div>
<?endif;?>
<?if($arParams["DISPLAY_PICTURE"]!="N" && is_array($arItem["PREVIEW_PICTURE"])):?>
<div style="clear:both"></div>
<?endif?>
<?foreach($arItem["FIELDS"] as $code=>$value):?>
<small>
<?=GetMessage("IBLOCK_FIELD_".$code)?>: <?=$value;?>
</small><br />
<?endforeach;?>
<?foreach($arItem["DISPLAY_PROPERTIES"] as $pid=>$arProperty):?>
<small>
<?=$arProperty["NAME"]?>:
<?if(is_array($arProperty["DISPLAY_VALUE"])):?>
<?=implode(" / ", $arProperty["DISPLAY_VALUE"]);?>
<?else:?>
<?=$arProperty["DISPLAY_VALUE"];?>
<?endif?>
</small><br />
<?endforeach;?>
</div>
</div>
</a>
<?endforeach;?>
</li>
</ul>
|
И в каждом массиве много элементов, потому ваш вариант я думаю не пойдёт... Не подскажете как можно реализовать счётчик итераций? Спасибо!
Я так понимаю должно быть что-то вроде: for($i=0; $i % $res; $i++) ? | |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 11:47)
| | Я вас же просил показать элементы массива, то есть не элементы вложенных, так что догадаться что там целая куча...
Кроме этого, не понятно чего вам надо - заменить DIV, SMALL на UL, LI или что?
И коли вопрос стоит так, то структуру массива исходного и полностью структуру выходного кода надо показывать, иначе никто вам не даст желаемого ответа. | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 11:54)
| | Вы же просили часть массива показать, а там где стоят многоточия - идёт продолжение)
Мне не надо ничего заменять, мне нужно чтобы вместо:
<ul>
<li>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
</li>
<ul>
|
На выходе получалось:
<ul>
<li>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
</li>
<li>
<a href="#"></a>
<a href="#"></a>
<a href="#"></a>
</li>
<li>
<a href="#"></a>
</li>
<ul>
|
Вот вложенный массив:
<?
Array
(
[0] => Array
(
[ID] => 25971
[IBLOCK_ID] => 141
[IBLOCK_SECTION_ID] =>
[NAME] => Новость 1
[ACTIVE_FROM] =>
[DETAIL_PAGE_URL] => /news/25971/
[DETAIL_TEXT] => Описание 1 новости
[DETAIL_TEXT_TYPE] => text
[PREVIEW_TEXT] =>
[PREVIEW_TEXT_TYPE] => text
[PREVIEW_PICTURE] =>
[LANG_DIR] => /
[SORT] => 500
[CODE] =>
[EXTERNAL_ID] => 25971
[IBLOCK_TYPE_ID] => news
[IBLOCK_CODE] => news
[IBLOCK_EXTERNAL_ID] =>
[LID] => s3
[LIST_PAGE_URL] => /news/
[EDIT_LINK] =>
[DELETE_LINK] =>
[DISPLAY_ACTIVE_FROM] =>
[FIELDS] => Array()
[DISPLAY_PROPERTIES] => Array()
)
...
)
?>
|
А количество "наружных" элементов массива будет стремиться к бесконечности - увеличение при каждом добавлении новости на сайт. Вот собственно и всё показал, или что ещё нужно? Очень нужно решить сегодня, спасибо за помощь! :) | |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 11:58)
| | Охринеть и не встать, только сейчас углядел. Это что, весь этот зоопарк тегов с вложением (DIV, SMALL...) является текстом ссылки, то есть фактически все это и есть ссылка? И нужно весь этот зоопарк прописать по три ссылки, да еще вложить и в LI? | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 12:09)
| | Именно так)) И это сделал не я - а разработчики движка Битрикс...) Но суть не в этом, мне кажется это как-то циклом или условием просто делается тем же счётчиком инкремента и делением без остатка - не затрагивая массивы)
Сейчас на выходе получаем:
<ul>
<li>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img1.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 1</div>
<div class="news-item-descr">Описание 1 новости</div>
</div>
</div>
</a>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img2.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 2</div>
<div class="news-item-descr">Описание 2 новости</div>
</div>
</div>
</a>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img3.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 3</div>
<div class="news-item-descr">Описание 3 новости</div>
</div>
</div>
</a>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img5.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 4</div>
<div class="news-item-descr">Описание 5 новости</div>
</div>
</div>
</a>
</li>
</ul>
|
А нужно:
<ul>
<li>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img1.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 1</div>
<div class="news-item-descr">Описание 1 новости</div>
</div>
</div>
</a>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img2.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 2</div>
<div class="news-item-descr">Описание 2 новости</div>
</div>
</div>
</a>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img3.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 3</div>
<div class="news-item-descr">Описание 3 новости</div>
</div>
</div>
</a>
</li>
<li>
<a class="news-item" href="#">
<div class="news-item-inner">
<div class="news-item-photo"><img src="img5.jpg"></div>
<div class="news-item-text">
<div class="news-item-title">Новость 4</div>
<div class="news-item-descr">Описание 5 новости</div>
</div>
</div>
</a>
</li>
</ul>
|
Вот где <li> выделил жирным)
Допустим есть:
<?
$count = count($arResult["ITEMS"]);
$limit = 3;
$res = ceil($count/$limit);
?>
|
И нужно как-то что-то сделать наподобие:
<ul>
<?
for($i=0; $i % $res; $i++) {
?>
<li>
{ВЕСЬ_КОД}
</li>
<?
}
?>
</ul>
|
| |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 12:12)
| | Я показываю простой пример, думаю суть из него понятна, что куда надо воткнуть - то что после условия и будет помещено трижды в тег LI, а со всем зоопарком разбирайтесь сами, уж слишком все дремучее (нафига куча условий и циклов в коде...).
<?
$a = array(1,2,3,4,5,6,7);
$ul = '<ul><li>';
for($i=0, $k=count($a); $i<$k; $i++) {
if($i && !($i % 3)) $ul .= '</li><li>';
$ul .= '<div>' . $a[$i] . '</div>';
}
$ul .= '</li></ul>';
echo $ul;
|
| |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 12:18)
| | Собственно наверное это и нужно, большое спасибо за помощь, попытаюсь сейчас разобраться! | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 12:18)
| | Блин я слишком туп для этого))) Как мне оставить цикл foreach, сделав разбиение циклом for внутри данного?) По логике должно быть вообще что-то вроде этого:
<ul>
<li>
<?foreach($arResult["ITEMS"] as $arItem):?>
<?if(count($arItem) % 3):?>
<a class="news-item" href="<?=$arItem["DETAIL_PAGE_URL"]?>">
{МНОГО_КОДА}
</a>
</li>
<li>
<?else:?>
<a class="news-item" href="<?=$arItem["DETAIL_PAGE_URL"]?>">
{МНОГО_КОДА}
</a>
<?endif;?>
<?endforeach;?>
</li>
</ul>
|
Весь остальной мусор я думаю вообще не нужно трогать) Может ты сможешь добить? Заранее спасибо! :) | |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 12:53)
| | Зачем вам foreach причем в таком использовании <?foreach($arResult["ITEMS"] as $arItem):?> ?
<?if(count($arItem) % 3):?> - это вообще глупость, итерацию цикла надо делить по модулю, а не количество элементов массива. Именно определяет, что прошло три итерации цикла и нужно закрыть элемент LI, открыв новый. А вы что пишите?
Хотите foreach, значит определите вне цикла переменную итераций, делите ее по модулю 3, увеличивая ее в цикле на 1 (инкремент). | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 13:05)
| | foreach нужен для всего внутреннего хлама и сохранения однотипности структуры движка) Мм, а примерчик можно?) Вот модернизированный (для упрощения) твой код:
<?$a = array(1,2,3,4,5,6,7);?>
<ul>
<li>
<?for($i=0, $k=count($a); $i<$k; $i++):?>
<?if($i && !($i % 3)):?>
</li>
<li>
<?endif;?>
<a href="3"><?=$a[$i]?></a>
<?endfor;?>
</li>
</ul>
|
Нужно как-то впихнуть сюда, не задевая {МНОГО_КОДА}:
<ul>
<li>
<?foreach($arResult["ITEMS"] as $arItem):?>
<a class="news-item" href="<?=$arItem["DETAIL_PAGE_URL"]?>">
{МНОГО_КОДА}
</a>
<?endforeach;?>
</li>
</ul>
|
Просто не совсем понял про определение вне цикла переменной итераций, и её деления на 3, увеличивая в цикле на 1... | |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 13:09)
| | Проблема не в foreach или for как таковом, а в том, что вы не понимаете сути работы этого кода.
Выбрасывайте к чертовой матери foreach, не удобен он для данного случая, а тем более в конструкции <?foreach():?> <?endforeach;?>. А также вот эту хрень <?if():?> <?endif;?> по той же самой причине.
Пишите так как я написал - "клейте строку", потом ее выведите. Обращаться к элементам массива в цикле for, это $arResult[$i]['key_name'].
{МНОГО_КОДА} - эту часть нужно прописывать вместо $ul .= '<div>' . $a[$i] . '</div>'; в моем примере. Правда там такой зоопарк... | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 13:22)
| | О том и речь, что зоопарк, плюс не хочется менять структуру движка... Я реально запутаюсь и накосячу пока всю "середину" буду переделывать... Если не сложно, поясните, пожалуйста, про определение вне цикла переменной итераций, и её деления на 3, увеличивая в цикле на 1... :)
Даже так не получается обратиться к элементам массива (выводится Array):
<ul>
<li>
<?for($i=0, $k=count($arResult["ITEMS"]); $i<$k; $i++):?>
<?if($i && !($i % 3)):?>
</li>
<li>
<?endif;?>
<a href="3"><?=$arResult["ITEMS"][$i]?></a>
<?endfor;?>
</li>
</ul>
|
| |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 13:24)
| | Это никак не структура движка, это просто проход в цикле, и именно конструкция, которая в нем применена в данном случае "куча грязи", в которой легко запутаться.
Вне цикла переменная нужна:
<?
$i = 0;
foreach($array as $value) {
if($i && !($i % 3)) $ul .= '</li><li>'; //это означает, что если не первая итерация цикла и пройдено три его итерации, то закрыть/открыть тег LI
//если использовать конструкцию if-endif, то нужно не $ul .= '</li><li>';, а вывод </li><li> в этой конструкции
<?if($i && !($i % 3)):?>
</li><li>
<?endif?>
//а далее зоопарк МНОГО_КОДА
//то есть условие проверяющее деление по модулю предваряет каждую итерацию цикла
$i++; //икремент счетчика итерации, после вывода закрывающего тега А
}
|
| |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 13:37)
| | Т.е. в итоге получается так?
<ul>
<li>
<?$i = 0;?>
<?foreach($arResult["ITEMS"] as $arItem):?>
<?if($i && !($i % 3)):?>
</li>
<li>
<?endif?>
<a class="news-item" href="<?=$arItem["DETAIL_PAGE_URL"]?>">
{МНОГО_КОДА}
</a>
<?$i++;?>
<?endforeach;?>
</li>
</ul>
|
| |
|
|
|
|
|
|
|
для: Electron
(25.11.2014 в 13:45)
| | Да. | |
|
|
|
|
|
|
|
для: confirm
(25.11.2014 в 13:49)
| | Хм, огромное спасибо за помощь и объяснения, кажется то что нужно и с минимальным кодом! А то перелопачивать всю "кучу грязи" не хочется, сейчас буду проверять)
Да, всё работает идеально!
Собственно вот результат выполнения)
Ещё раз спасибо :) | |
|
|
|