Разбить массив Foreach на нечетные и четные числа - PullRequest
0 голосов
/ 29 декабря 2018

Вот массив

    $array = [
a=>["name"= "name1", "id"="1"..], 
b=>["name"= "name2", "id"="2"..], 
c=>["name"= "name3", "id"="3"..],
d=>["name"= "name4", "id"="4"..],
e=>["name"= "name5", "id"="5"..], 
f=>["name"= "name6", "id"="6"..],......);

Чего я хочу добиться, так это цикла foreach для отображения таких элементов

Дизайн

Image Link

вот что я сделал, но не повезло

$len = count($moduleTypes); 
$firsthalf = array_slice($moduleTypes, 0, $len / 2);
$secondhalf = array_slice($moduleTypes, $len / 2);

Разбить массив и отобразить каждый из них по отдельности, цикл Foreach должен продолжаться, но на второй итерации его нужно выполнить два раза[B, C] и следующую итерацию один раз [D] и т. Д. Проверьте изображение на перспективу

Ответы [ 4 ]

0 голосов
/ 29 декабря 2018

Хитрая часть - это таблица HTML.Поздравляю с успешным умник-снайпер меня.

<?php

$arr = ['A','B','C','D','E','F','G','H','I','J','K','L'];

$second_row = [];
$first_row_next = 1;

echo "<table border='1'>";
echo "<tr>";

for($i=0;$i<count($arr);$i++){
  if($i%3 == 0){
    echo "<td rowspan='2'>$arr[$i]</td>"; // belongs to the first row with rowspan
  }else if($i == $first_row_next){
    echo "<td>$arr[$i]</td>";// belongs to first row with no rowspan since it's other subordinate will come down under it.
    $first_row_next += 3;
  }else{
    $second_row[] = $arr[$i];
  }
}

echo "</tr>";
echo "<tr><td>".implode("</td><td>",$second_row)."</td></tr>";
echo "</table>";

Вывод:

Создает следующую таблицу HTML:

<table border='1'>
  <tr>
    <td rowspan='2'>A</td>
    <td>B</td>
    <td rowspan='2'>D</td>
    <td>E</td>
    <td rowspan='2'>G</td>
    <td>H</td>
    <td rowspan='2'>J</td>
    <td>K</td>
  </tr>
  <tr>
    <td>C</td>
    <td>F</td>
    <td>I</td>
    <td>L</td>
  </tr>
</table>

Алгоритм:

  • Мы видим эту таблицу как 2 строки.
  • Итак, первый ряд будет иметь A, B, D, E, G, H, J, K.
  • Вторая строка имеет C, F, I, L.
  • Если вы посмотрите на индексы массива, каждое значение на индексах 0,3,6,9 .... делает егоиметь размер строки 2 в таблице.Отсюда первое условие: if($i%3 == 0).
  • Для значений первой строки, у которых под ними находятся другие подчиненные, их индексы следуют как 1,4,7,10 ... и т. Д. Без разрыва строки.$first_row_next отслеживает это и выводит данные td соответственно.
  • Для второй строки любой индекс массива, который не соответствует вышеуказанным требованиям, попадает под вторую строку.Следовательно, мы собираем их во второй массив и выводим вторую строку в конце.

Работа таблицы HTML:

Первая строка :

<tr>
    <td rowspan='2'>A</td>
    <td>B</td>
    <td rowspan='2'>D</td>
    <td>E</td>
    <td rowspan='2'>G</td>
    <td>H</td>
    <td rowspan='2'>J</td>
    <td>K</td>
</tr>

Создает первыйстрока.Все идет нормально. вторая строка :

<tr>
    <td>C</td>
    <td>F</td>
    <td>I</td>
    <td>L</td>
</tr>

Способ визуализации:

  • Всего в таблице 2 строки.
  • Когда нужно визуализировать C, он ищет пространство в A, но не получает его, поэтому он переходит к следующему столбцу.Он входит в B, поэтому привязывается.
  • Для F он находит пробел для добавления td ниже E и т. Д. С другими значениями.
0 голосов
/ 29 декабря 2018

Я думаю, это то, что вам нужно

for ($i = 1; $i <= count($array); $i = $i + 3) {

echo '<br>';
echo '-' . $array[$i-1] . '-';
if (!isset($array[$i])) break;
echo '<br>';
echo $array[$i] . ' ';
if (!isset($array[$i+1])) break;
echo $array[$i+1];

}

Вы можете играть здесь http://sandbox.onlinephpfunctions.com/code/b3fba97df75b235b1acccacf82b800e21f3924f5

0 голосов
/ 29 декабря 2018
<?php
$array = [
"a"=>["name"=> "name1", "id"=>"1"], 
"b"=>["name"=> "name2", "id"=>"2"], 
"c"=>["name"=> "name3", "id"=>"3"],
"d"=>["name"=> "name4", "id"=>"4"],
"e"=>["name"=> "name5", "id"=>"5"],
"f"=>["name"=> "name6", "id"=>"6"]
];

$keys = array_keys($array);

foreach(array_keys($array) as $i => $key) {
    switch($i % 3) {
        case 2: // case: 3rd values
            continue;
        break;
        case 1: // case: 2nd values
            $nextkey = $keys[$i + 1];
            // show $key and $nextkey
            print_r($array[$key]);
            if( $array[$nextkey] ) {
                print_r($array[$nextkey]);
            }
            echo "---\r\n"; // delimiter
        break;
        default:
            // case: very first and every 4th values
            print_r($array[$key]);
            echo "---\r\n"; // delimiter
    }

}

Вы можете использовать array_keys, а затем использовать значение индекса, как если бы вы использовали цикл for.Я не знаю, почему вы хотите использовать цикл foreach.For-loop, кажется, лучше для этого.switch-case может сделать его более читабельным, вы можете комментировать ваши случаи.

0 голосов
/ 29 декабря 2018

Это не точное решение, но оно будет точной логикой, которую вы можете реализовать в своем HTML-коде

<?php

$array = array(1,2,3,4,5,6,7);

$counter = 1;
$temp = "";
foreach($array as $val){

    if($temp == 1){
        echo "E$val<br>";
        $temp=0;
        $counter++;
    }else{
        if($counter % 2 == 0){
            echo "E$val<br>";

            $temp = 1;
        }else{
            echo "O$val<br>";
        }
    }

    $counter++;

}

O / p. Мне нравится

O1
E2
E3
O4
E5
E6
O7

Где OA,D,G И E - B,C,E,F

Обновление

foreach($array as $key => $val){

    if($temp == 1){
        echo "E".$val['name']."<br>";
        $temp=0;
        $counter++;
    }else{
        if($counter % 2 == 0){
            echo "E".$val['name']."<br>";

            $temp = 1;
        }else{
            echo "O".$val['name']."<br>";
        }
    }
    $counter++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...