@anton99zel
29а класс средней школы №7

Сортировка и вывод из двух массивов — как сделать?

К примеру, есть отдельный массив
$key1 = 0;
foreach ($Item as $Items) {
{?><div class="element"><?=$key1?><?=$Items[name]?></div><?};
$key1++;
}

И есть ещё такой массив
$key2 = 0;
foreach ($Model as $Offers) {
{?><div class="spec"><?=$key2?><?=$Offers[name]?></div><?};
$key2++;
}

Как получить такой вывод:
чтобы после каждого третьего элемента из первого массива вставал один элемент из второго массива?
т.е. так:
<div class="element">1 название</div>
<div class="element">2 название</div>
<div class="element">3  название</div>
<div class="spec">1 название элемента из второго массива</div>
<div class="element">4 название</div>
<div class="element">5 название</div>
<div class="element">6 название</div>
<div class="spec">2 название элемента из второго массива</div>
<div class="element">7  название</div>
<div class="element">8  название</div>
<div class="element">9  название</div>
<div class="spec">3 название элемента из второго массива</div>


А если нельзя вставить элемент после третьего элемента, то разместить остатки в конце списка....
PS:
Я пробовал, используя
if (($key1) % 3 == 1 )
Это позволяет после каждого третьего элемента что то вставлять, но как вставить в каждый цикл именно один элемент, а не все сразу и без повторов не сообразил пока.
  • Вопрос задан
  • 71 просмотр
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
Просто в одном цикле проверяешь условие, что из второго массива выведена ровна треть от первого массива.

Примерно так:
Код
$Item = [
	0, //нумерация с 1
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
	[ 'name'=>'название' ],
];

$Model = [
	0,
	[ 'name'=>'название элемента из второго массива' ],
	[ 'name'=>'название элемента из второго массива' ],
	[ 'name'=>'название элемента из второго массива' ],
];

$key1 = 1; //для $Item
$key2 = 1; //для $Model
while ($key1 < count($Item) || $key2 < count($Model)) { //итерируем оба массива
	if ($key1 < count($Item)) echo("<div class='element'>$key1 ".$Item[$key1]['name']."</div>\n");
	if ($key1 / 3 >= $key2) { //если соотношение достигло одной трети
		//то вывести один элемент из второго массива
		if ($key2 < count($Model)) echo("<div class='spec'>$key2 ".$Model[$key2]['name']."</div>\n");
		$key2++; //и посчитать его
	}
	$key1++;
}
Результат
<div class='element'>1 название</div>
<div class='element'>2 название</div>
<div class='element'>3 название</div>
<div class='spec'>1 название элемента из второго массива</div>
<div class='element'>4 название</div>
<div class='element'>5 название</div>
<div class='element'>6 название</div>
<div class='spec'>2 название элемента из второго массива</div>
<div class='element'>7 название</div>
<div class='element'>8 название</div>
<div class='element'>9 название</div>
<div class='spec'>3 название элемента из второго массива</div>
Ответ написан
Комментировать
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Пишу с тела. Не проверял
$i = $j = 0;
while (!empty($Model) || !empty($Item)) {
    if ($element = array_shift($Item)) { ?><div class="element"><?= ++$i ?> <?= $element['name'] ?></div><?php }
    if ($element = array_shift($Item)) { ?><div class="element"><?= ++$i ?> <?= $element['name'] ?></div><?php }
    if ($element = array_shift($Item)) { ?><div class="element"><?= ++$i ?> <?= $element['name'] ?></div><?php }
    if ($spec = array_shift($Model)) { ?><div class="spec"><?= ++j ?><?= $spec['name'] ?></div><?php } 
}

Я постарался написать просто чтобы была понятна сама идея. Когда поймёте как это работает, можете добавить циклы для повторяющихся элементов и оформить код.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 15:01
35000 руб./за проект
19 апр. 2024, в 14:12
30000 руб./за проект