Dienstag, Januar 21, 2020

Ziehen Sie Elemente von next foreach Element in PHP?

Mache ich ein PHP – „Ampel“ – Stil-warn-system für meine website, die im Grunde sagt „wenn es X prozentuale Veränderung zwischen dem aktuellen array-Eintrag ist und die nächsten ein, werfen einen Fehler‘.

So, ich bin looping durch meine array-Elemente in einer foreach-Schleife, jedoch müssen in der Lage sein, so etwas zu tun: (Hinweis: dies ist nur ein einfaches Beispiel, aber sollte genug sein, um die Idee)

foreach($array as $a)
{
$thisValue = $a['value'];
$nextValue = next($a['value']);

$percentageDiff = ($nextValue-$thisValue)/$thisValue;
}

Habe ich die next () – tags, um den nächsten Wert aber verstehen, das funktioniert nur bei arrays. Gibt es noch etwas, das ich verwenden können, um das nächste foreach item?

Vielen Dank für Ihre Zeit!

  • mögliche Duplikate von Peek Voraus bei der Iteration ein array in PHP 5.2
  • Vielen Dank für die Antworten – alles schien wirklich großartige Möglichkeiten, dies getan. Ich entschied mich für die Lösung von @Orbling und @ansteckend, Während es verursacht eine sehr moddest overhead, kann ich mit Leben gegeben, wie oft die Funktion aufgerufen wird.
InformationsquelleAutor Sk446 | 2011-01-21

8 Kommentare

  1. 10

    tun es in die andere Richtung, und speichern Sie den vorherigen Eintrag und vergleichen diese.

    $prev = null;
    foreach ($item as $i){
        if ($prev !== null){
            diff($prev, $i);
        }
        $prev = $i
    }
    • Ich habe up, das ist, was ich tun würde. (aber überprüfen Sie Ihre Klammern!)
    • ich glaube, diese Lösung hat einen unnötigen overhead 😉
    • danke, behoben
    • Prost! Hätte nie gedacht, über die Verwendung der vorherigen Platte…verdammt, ich fühle mich doof! :p
  2. 4

    Einfache Antwort: nicht mit einem foreach Schleife. Verwenden Sie einen einfachen for loop statt:

    for ($i = 0; $i < count($array); $i++) {
        if (isset($array[$i + 1])) {
            $thisValue = $array[$i]['value'];
            $nextValue = $array[$i + 1]['value'];
    
            $percentageDiff = ($nextValue-$thisValue)/$thisValue;
        }
    }
    • Dies funktioniert nicht für assoziative arrays wie Wörterbücher und Hashtabellen, richtig?
  3. 1

    Sollten Sie in der Lage sein zu verwenden:

    foreach($array as $a)
    {
        $array_copy = $array;
        $thisValue = $a['value'];
    
        $nextValue = next($array_copy);
        $nextValue = $nextValue['value'];
    
        $percentageDiff = ($nextValue-$thisValue)/$thisValue;
    }

    Diese kopiert das array und dann bewegt sich der Zeiger entlang durch 1.

  4. 1

    Die einfachste Lösung IMO ist Ihre Denkweise ändern. Anstelle der Prüfung der aktuellen und der nächsten Platte, überprüfen Sie die vorherigen und dem aktuellen Datensatz. Die Erinnerung an die vorhergehende, ist einfacher als immer den nächsten.

    Wenn Sie das nicht wollen, können Sie auch Graben die foreach und Durchlaufen im C-Stil verwenden for und eine Zähler-variable – ein cavet aber: der PHP-sparse-arrays können beißen Sie, so dass Sie am besten anrufen array_values() auf das zu prüfende array vor der Iteration.

  5. 1

    Wenn Sie möchten, mit zu arbeiten foreach könnten Sie vergleichen den aktuellen Wert mit der vorherigen Wert, anstatt mit dem nächsten Wert:

    $previous = null;
    foreach ($array as $a) {
        if (!is_null($previous)) {
            $thisValue = $previous['value'];
            $nextValue = $a['value'];
            $percentageDiff = ($nextValue-$thisValue)/$thisValue;
        }
        $previous = $a;
    }

    Mit diesem können Sie einfach die Umschalttaste die ganze iteration, um einen Eintrag.

  6. 1

    Warum nicht einfach eine normale for-Schleife anstatt der foreach-iterator?

    <?php
        $testArray = array(10,20,30,40,50,60,70,80,90,100);
    
        $elementCount = count($testArray);
        for($loop=0; $loop<$elementCount; $loop++) {
    
            $thisValue = $testArray[$loop];
    
            //Check if there *is* a next element.
            $nextValue = $loop + 1 < $elementCount ? $testArray[$loop + 1] : null;
    
            //Calculate the percentage difference if we have a next value.
            if($nextValue) $percentageDiff = ($nextValue-$thisValue)/$thisValue;
        }
    ?>
    • Dies funktioniert nicht für assoziative arrays wie Wörterbücher und Hashtabellen, richtig?
    • Sie müssten, um zu extrahieren die array_keys und ausprobieren, mit denen in dieser Instanz.
    • Ich war übrigens nur mit der Skizzierung möglicher Weg, diese (und auch alle anderen-bis-Datum) sind natürlich nicht nutzbare Implementierungen, wie Sie freudig stampfen alle über den ‚Anteil diff‘ jedes mal, wenn Sie Durchlaufen. 🙂
    • Ich dachte, Sie verstanden, der Kommentar war mehr für den ursprünglichen poster. Es ist vielleicht nicht so offensichtlich für andere.
    • Dachte so. Jedoch, die Antwort von @ansteckend, verwendet die foreach-iterator ist wesentlich eleganter, so dass ich bezweifle, dass jemand die Augen fallen wird, diese low-down. Schön zu klären solche Dinge sowieso, das sagte. 🙂
  7. 1

    ‚Es ist in der Regel einfacher zu verwenden, wird der Vorherige Wert als die nächste:

    $lastValue = NULL;
    foreach ($array as $a) {
        if ($lastValue === NULL) {
            $lastValue = $a['value'];
            continue;
        }
    
        $percentageDiff = ($a['value'] - $lastValue) / $lastValue;
    
        $lastValue = $a['value'];
    }
    • Vorherigen Wert arbeiten würde – das wird es viel einfacher machen … eigentlich…nicht sicher, warum ich nicht daran denke 🙂
  8. 1
    for($i=0;$i<count($array);$i++) {
    $thisValue = $array[$i];
    $nextValue = $array[i+1]; //will not be set if $i==count($array)-1
    $percentageDiff = ($nextValue-$thisValue)/$thisValue;
    }

    Gibt es in der Tat array iterator Funktionen, die das unterstützen, was Sie brauchen, und auch einfach Schleife durch ein array mit next() /prev() usw. funktioniert einwandfrei, aber die Lösung oben ist eleganter

    Es funktioniert nicht mit foreach, weil foreach erstellt eine Kopie von Referenzen und nicht die array-Zeiger in das array selbst.

    Hier ist ein Beispiel, das verwendet werden kann für assoziative arrays mit dem array-iterator-Funktionen:

    $arrayobject = new ArrayObject($array);
    $iterator = $arrayobject->getIterator();
    
            for($i=0;$i<count($array);$i++) {
               $iterator->seek($i);
               $thisValue = $iterator->current();
               $iterator->seek($i+1);
               $nextValue = $iterator->current(); 
               $percentageDiff = ($nextValue-$thisValue)/$thisValue;
            }
    • Dies funktioniert nicht für assoziative arrays wie Wörterbücher und Hashtabellen, richtig?
    • das ist richtig, das ist, warum ich verknüpft mit der array-iterator-Funktionen sind perfekt geeignet. eine weitere Möglichkeit ist daran zu erinnern, das Letzte array-element und berechnen auf dieser Basis und schieben Sie die Ausgabe durch einen Eintrag – habe ich ein Beispiel-code, um die Antwort

Kostenlose Online-Tests