Items loop php

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bryan De Baar

Bryan De Baar

26/03/2019 13:28:22
Quote Anchor link
Hallo,


Met php heb ik een array die ik loop, na elk item heb ik een $count++;

Nu wil ik elke 2 items bundelen binnen een div element. Stel ik heb 4 items dan worden dit 2 bundels.
Welke methode zou ik hiervoor kunnen gebruiken?

Gr. Bryan
 
PHP hulp

PHP hulp

20/10/2020 00:55:30
 
Jop B

Jop B

26/03/2019 14:04:13
Quote Anchor link
Hi Bryan,


Bedoel je zoiets?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$count
= 1;
foreach( $users as $user)
{

    if ($count%2 == 1)
    {
  
         echo "<div>";
    }

    echo $user;
    if ($count%2 == 0)
    {

        echo "</div>";
    }

    $count++;
}

if ($count%4 != 1) echo "</div>";
?>
Gewijzigd op 26/03/2019 14:58:27 door Jop B
 
Rob Doemaarwat

Rob Doemaarwat

26/03/2019 14:18:51
Quote Anchor link
Of met array_chunk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
foreach(array_chunk($array,4) as $chunk){
  print('<div>');
  foreach($chunk as $item) print("<p>$item</p>");
  print('</div>');
}
 
Thomas van den Heuvel

Thomas van den Heuvel

26/03/2019 16:31:18
Quote Anchor link
@JopB
if ($count%4 != 1) echo "</div>";

Dat lijkt mij niet kloppen. Als $users bijvoorbeeld 14 elementen heeft wordt er een div teveel afgesloten.

Ook is het nogal apart dat je begint te tellen bij 1, in plaats van 0.

Een generieke(re) variant is bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$items
= array('een', 'twee', 'drie', 'vier', 'vijf');
$break = 2;

$open = false;
$i = 0;
foreach ($items as $item) {
    if ($i % $break == 0) {
        if ($open) {
            echo '</p>';
            $open = false;
        }

        echo '<p>';
        $open = true;
    }

    echo $item;
    $i++;
}


if ($open) {
    echo '</p>';
}

?>

En array_chunk() is natuurlijk nog korter.
Gewijzigd op 26/03/2019 16:32:14 door Thomas van den Heuvel
 
Bryan De Baar

Bryan De Baar

26/03/2019 19:29:59
Quote Anchor link
Bedankt voor de reacties :) ik heb gekozen voor de methode van Thomas.
@thomas zou je er misschien comments bij willen zetten zodat ik php beter leer begrijpen wat er staat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$items
= array('een', 'twee', 'drie', 'vier', 'vijf');
$break = 2;

$open = false;
$i = 0;
foreach ($items as $item) {
    //wat gebeurt er bij dit if statement?
    if ($i % $break == 0) {
        //word bij dit statement gekeken of $open true is?
        if ($open) {
            echo '</p>';
            $open = false;
        }

        echo '<p>';
        $open = true;
    }

    echo $item;

   //hier word de variabel +1
    $i++;
}


if ($open) {
    echo '</p>';
}

?>

[\code]
 
Frank Nietbelangrijk

Frank Nietbelangrijk

26/03/2019 23:41:04
Quote Anchor link
>> wat gebeurt er bij dit if statement?

Het % symbool berekend het restant van een deling. Bijvoorbeeld
7 % 3 = 1 (je kan twee keer drie stuks halen uit zeven stuks en dan hou je er één over)
6 % 2 = 0 (je kan drie keer twee stuks halen uit zes stuks en houdt dan niets / nul over)

>> word bij dit statement gekeken of $open true is?

Ja. De volgende zijn gelijkwaardig:
if(true === $open)
if($open === true)
if($open)
Ook kun je false gebruiken:
if(false === $open)
if($open === false)
if(!$open)

>> //hier word de variabel +1

Klopt. Dit is allemaal (bijna) hetzelfde:
$i++
$i = $i + 1;
$i += 1;
++$i;

er zit wel een verschil in $i++ en ++$i. Bekijk de volgende snippets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

$i
= 1;
echo $i++; // output: 1

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

$i
= 1;
echo ++$i; // output: 2

?>


De laatste verhoogd $i eerst met één voordat deze hem echo-t. De prioriteit ligt bij ++$i dus hoger dan bij $i++ zou je kunnen zeggen.
 
Thomas van den Heuvel

Thomas van den Heuvel

27/03/2019 01:43:15
Quote Anchor link
@Frank heeft het hierboven al goed verwoord. Boolse variabelen (variabelen met uitsluitend de waarde true of false) hoef je niet per se te vergelijken met true of false, al zou het de leesbaarheid ten goede kunnen komen als je de ontkenning van een waarde die true zou moeten zijn expliciet vergelijkt met false, omdat je een uitroepteken ( ! ) snel over het hoofd kunt zien.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$someVar
= true;

if ($someVar === true) { // expliciete vergelijking niet echt nodig, simpelweg if ($someVar) { ... } volstaat
  // ...

}

if ($someVar === false) { // kan handig zijn
  // ...

}
// of zelfs
if (false === $someVar) { // om ervoor te zorgen dat je dit nooit met een toekenning ($someVar = false;) verwart
  // ...

}
?>

Daarnaast kan het ook handig zijn om dit soort Boolse variabelen een naam te geven die een true/false toestand aanduidt. Mogelijk was dus $tagOpen of $tagIsOpen ofzo een betere naam geweest dan $open omdat dat min of meer een ja/nee waarde impliceert.
Gewijzigd op 27/03/2019 01:47:07 door Thomas van den Heuvel
 
Bryan De Baar

Bryan De Baar

27/03/2019 19:23:50
Quote Anchor link
@frank @thomas bedankt voornde heldere uitleg betreft dit stukje PHP.
Kun je dan ook controleren op het laaste <ul> element?
Daarmee bedoel ik doe iets met elk laatste <ul> element.
 
Thomas van den Heuvel

Thomas van den Heuvel

27/03/2019 22:55:10
Quote Anchor link
Je bedoelt het laatste element (de laatste <li>)?

Ja, je kunt controleren of je bij de laatste index bent aangeland door $i (voordat je deze verhoogt) te vergelijken met het aantal items van $items minus 1, omdat je begint te tellen bij 0.

Dit zijn in principe alle operaties op arrays, dus los van deze specifieke vraagstelling zou je je kunnen verdiepen in de werking van arrays (hoe vraag ik (de index van) het laatste element van een array op?). Dit soort vraagstukken kun je ook in Goegel gooien met hierin de prefix "php", daarmee kom je meestal een eind.
Gewijzigd op 27/03/2019 22:57:15 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

28/03/2019 07:03:33
Quote Anchor link
Alhoewel array_key_first en array_key_last wel heel erg vers van de pers zijn (PHP 7.3), dus die komen nog niet heel erg bovendrijven in Google.

Maar als het zeker te weten een gewone array is met een numerieke, opeenvolgende key, dan is count($items) - 1 net zo handig.
 
Thomas van den Heuvel

Thomas van den Heuvel

28/03/2019 17:32:13
Quote Anchor link
Rob Doemaarwat op 28/03/2019 07:03:33:
Maar als het zeker te weten een gewone array is met een numerieke, opeenvolgende key, dan is count($items) - 1 net zo handig.

Hoeft niet eens opvolgend of numeriek te zijn, daar wordt count() niet door gehinderd.
 
Rob Doemaarwat

Rob Doemaarwat

28/03/2019 18:05:13
Quote Anchor link
Thomas van den Heuvel op 28/03/2019 17:32:13:
Hoeft niet eens opvolgend of numeriek te zijn, daar wordt count() niet door gehinderd.

Klopt, maar als ie niet oplopend is kun je de index uit de for-loop niet gebruiken om naar het item in de array te refereren.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$a = [4 => 'foo', 7 => 'bar'];
for($i = 0; $i < count($a); $i++)
  print($a[$i]); // <- error
 
Thomas van den Heuvel

Thomas van den Heuvel

28/03/2019 19:10:41
Quote Anchor link
Rob Doemaarwat op 28/03/2019 18:05:13:
Klopt, maar als ie niet oplopend is kun je de index uit de for-loop niet gebruiken om naar het item in de array te refereren.

Klopt, en daarom is het eigenlijk (altijd?) beter om een foreach te gebruiken, evetueel met $key => $value als je de key nodig hebt. Soms hebben arrays enkel interessante keys en triviale values, in welk geval je zoiets kunt doen als $key => $dummy ofzo.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.