✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Skriva loopar i PHP: Två sätt; Samma sak

26

När du arbetar med en samling i PHP, framför allt arrayer i PHP, finns det två sätt på vilka du i första hand ser informationen manipulerad:

  1. genom for slingor,
  2. genom en mängd olika array funktioner som PHP tillhandahåller.

För vad det är värt tror jag att array funktionerna ger större läsbarhet men de har visat sig vara långsammare (särskilt med större data – med mindre data kommer det naturligtvis att vara försumbart).

Jag jobbar ofta med forloopar och relaterade funktioner för att uppnå samma sak men jag tänkte att det kan vara värt att titta på ett exempel från förra inlägget och hur jag använde arrayfunktionerna för att uppnå samma saker som en for loop.

I slutändan är detta ett jämförelseinlägg men jag tycker att det är bra att se hur samma kod kan skrivas på olika sätt.

Skriva loopar i PHP

Från början gör jag inget påstående om vilket som är bättre. Detta är helt enkelt för att visa hur skrivslingor i PHP kan uppnås på flera sätt.

Det är upp till dig hur du vill implementera det.

Målet med detta exempel är att visa:

  • hur man får taggar för ett givet inlägg,
  • läs deras namn är en röravgränsad array,
  • returnera taggnamnen åtskilda av röret i ett strängformat.

Och här är de två sätten att göra det.

Använda en standardslinga

Att använda en standardslinga for kan se ut så här:

<?php

// Setup the array to store the tag names.
$tagNames = [];

// Iterate through all of the tags.
$tags = get_the_tags();
for ($i = 0; $i < count($tags); $i++) {
  $currentTag = $tags[$i];

  // Only add names that have not been added.
  if (!in_array($currentTag->name, $tagNames)) {
      $tagNames[] = $currentTag->name;
  }
}

// Break the names of the the tags into a '|' delimited string.
$tagNameString = implode('|', $tagNames);

// Clean up the string so any trailing pipes are removed.
$tagNameString = rtrim($tagNameString, '|');

Lägg märke till att jag:

  1. initiera en sträng,
  2. läs taggarna
  3. iterera igenom dem och lägg till dem bara om de inte redan finns,
  4. separera arrayen med ett rör,
  5. ta bort eventuella släprör

Då har jag snöret jag kan lämna tillbaka.

Använda Array-funktioner

I det här exemplet gör jag samma sak men koden är lite mer kompakt:

<?php

// Seperate each indidivudal entry by a '|'
implode(
  '|',
  // Remove any duplicates in the array.
  array_filter(
    /* iterate through the list of tags and add the names to an 
     * array that's returned to filter.
     */
    array_map(function ($tag) {
      return $tag->name;
    }, get_the_tags())) );

Det är bra att läsa koden från den innersta funktionen till den yttersta. Med det, här är vad som händer:

  1. Jag tar taggarna, itererar genom var och en av dem med en anonym funktion som skickas till array_map,
  2. Jag använder sedan den returnerade arrayen och skickar den till array_filter så att dubbletter tas bort,
  3. Sedan konverterar jag arrayen till en röravgränsad sträng.

Ungefär som ovan har jag snöret jag kan lämna tillbaka.

Det är allt?

Japp – och det är det. Jag säger inte att läsbarheten för den andra funktionen är bättre men jag kommer att säga att den kräver färre steg.

Kom också ihåg att större datamängder kanske inte fungerar lika bra.

Oavsett vilket är det riktigt trevligt att använda inbyggda array-funktioner eftersom det ger en nivå av inbyggd funktionalitet som är inbyggd i PHP (medan for loopar är vanligare på alla språk) som kan spara tid (som att filtrera bort dubbletter av data).

Några referenser?

Faktiskt ja. Bortsett från PHP-manualen tror jag att Carl Alexander utan tvekan har den mest omfattande artikeln om detta ämne.

Skriva loopar i PHP: Två sätt; Samma sak

Det är väl värt din tid att läsa den i sin helhet, särskilt om du tyckte att det här inlägget var intressant.

Inspelningskälla: tommcfarlin.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer