2016-05-26 10 views
0

Ich habe zwei Array, das erste sieht so aus (beachten Sie, dass created und approved sind nur zwei von etwa sechs Element für dieses Beispiel);Wie überprüfen, ob ein Array-Schlüssel in einem anderen Array vorhanden ist

Array 
(
    [created] => Array 
     (
      [label] => Order created 
      [roles] => Array 
       (
        [0] => ROLE_USER 
       ) 

      [next_states] => Array 
       (
        [approve] => Array 
         (
          [target] => approved 
         ) 

       ) 

     ) 

    [approved] => Array 
     (
      [label] => Order approved 
      [roles] => Array 
       (
        [0] => ROLE_USER 
       ) 

      [next_states] => Array 
       (
        [order] => Array 
         (
          [target] => ordered 
         ) 

       ) 

     ) 
) 

Sobald Schritt (wie created etc.) abgeschlossen ist, wird ein weiterer Array wie folgt aufgefüllt; (Hier können Sie dieses Array nennen arrayFinished)

Array 
(
    [created] => 1 
) 

Wie kann ich diese zwei Arrays vergleichen drei verschiedene Zustände zu erhalten; completed, active und disabled. Etwas wie; Wenn Schritt created in arrayfinished Echo abgeschlossen ist, wird der Schritt created von elseif zu arrayfinished echo active hinzugefügt, sonst deaktiviert.

Dies ist, was ich versucht habe, aber ich bekomme eine falsche Ausgabe;

foreach ($steps as $key => $value) { 
      if (array_key_exists($key, $arrayFinished)) { 
       echo $value['label'] . ' is complete<br>'; 
      } elseif ($key === end($arrayFinished)) { 
       echo $value['label'] . ' is active<br>'; 
      } else { 
       echo $value['label'] . ' is disabled<br>'; 
      } 
     } 

Dies ist Mai Ausgabe von oben foreach:

Order created is complete 
Order approved is disabled 
Order ordered is disabled 
Order delivered is disabled 
Invoice verified correct is disabled 
Invoice paid is disabled 

Die ersten (erstellt) aktiv sein soll, weil es die ‚letzte‘ ein in der Anordnung ist.

Kann mir jemand bitte helfen, das zu bekommen, weil ich jetzt ein paar Stunden mit etwas kämpfe, das einfach klingt. Wird der Zweig einfacher? Weil ich eine Div-Klasse auf den zurückgegebenen Wert setzen muss.

Wenn in PHP getan, wie bekomme ich es zu Twig?

Bitte, ich brauche verzweifelt Hilfe.

+0

'end' wird Ihnen den letzten' Wert' in der Array nicht den Schlüssel geben. Sie können 'end (array_keys ($ arrayFinished))' 'tun, jedoch wäre es besser, den letzten Schlüssel in einer Variablen vor der Schleife zu speichern, um die Leistung einer kleinen Sache zu verbessern. – ArtisticPhoenix

+0

@RyanVincent Ich verstehe nicht, was Sie meinen –

Antwort

0

end() wird nur das letzte Element des Arrays bewegen, dann müssen Sie key() Funktion verwenden:

foreach ($steps as $key => $value) { 
    if (array_key_exists($key, $arrayFinished)) { 
     echo $value['label'] . ' is complete<br>'; 
    } else { 
     end($arrayFinished); 
     if ($key === key($arrayFinished)) { 
      echo $value['label'] . ' is active<br>'; 
     } else { 
      echo $value['label'] . ' is disabled<br>'; 
     } 
    } 
} 
+0

Ihre Antwort geben die gleiche Ausgabe wie die Antwort oben. Die letzte bleibt auch 'komplett' und ändert sich nicht zu 'aktiv' –

0

Wie ich in den Kommentaren sagte

$keys = array_keys($arrayFinished); 
    $last = end($keys); 

    foreach ($steps as $key => $value) { 
     if (array_key_exists($key, $arrayFinished)) { 
      echo $value['label'] . ' is complete<br>'; 
     } elseif ($key === $last) { 
      echo $value['label'] . ' is active<br>'; 
     } else { 
      echo $value['label'] . ' is disabled<br>'; 
     } 
    } 

den letzten Schlüssel, dass Get Array außerhalb der Schleife, anstatt end() zu verwenden und dieses Zeug nicht unnötig während der Schleife zu wiederholen. Und möglicherweise einige nutzlose Fehler vermeiden. Auch mit array_keys und dann end verschieben Sie den Zeiger im ursprünglichen Array nicht bis zum Ende. Das heißt, in der Regel, dass ohnehin nicht zu viel Probleme verursachen würde, aber ....

Sie auch diese

ändern könnte
.... 
    if (array_key_exists($key, $arrayFinished)) { 
    .... 

Um

.... 
    if (isset($arrayFinished[$key])) { 
    .... 

Was ich denke, ist ein kleines bisschen schneller auch. Aber es hat den gleichen Effekt.

UPDATE: Diese

ändern
 if (array_key_exists($key, $arrayFinished)) { 
      echo $value['label'] . ' is complete<br>'; 
     } elseif ($key === $last) { 
      echo $value['label'] . ' is active<br>'; 
     } else { 
      echo $value['label'] . ' is disabled<br>'; 
     } 

Um

 if ($key === $last) { 
      echo $value['label'] . ' is active<br>'; 
     } elseif (array_key_exists($key, $arrayFinished)) { 
      echo $value['label'] . ' is complete<br>'; 
     } else { 
      echo $value['label'] . ' is disabled<br>'; 
     } 

Der Grund dafür ist, dass die zweite Bedingung wird nie da ausgewertet werden, wenn es dann die erste wahr ist auch wahr ist, im Wesentlichen, wenn der Schlüssel ist der letzte im Array, dann wird er auch gesetzt. Also, der zweite wird nie ausgewertet werden ...

+0

Vielen Dank für Ihre Eingabe, aber ich bekomme immer noch nicht die letzte, die 'aktiv' ist, zeigt immer noch 'komplett' –

+0

ohne was zu wissen Der Inhalt von '$ steps' und' $ arrayFinished' ist unmöglich zu erkennen. Sie listen einige Arrays auf, aber es ist schwer zu sagen, welche Frage welche ist. – ArtisticPhoenix

+0

Sorry der kleine, kurze ist $ arrayFinished. Und das größere ist $ Schritte –

0
foreach ($steps as $key => $value) { 
     if (array_key_exists($key, $arrayFinished)) { 
      if (count($arrayFinished) > 1) { 
       echo $value['label'] . ' is active<br>'; 
      } else { 
       echo $value['label'] . ' is complete<br>'; 
      } 
     } else { 
      echo $value['label'] . ' is disabled<br>'; 
     } 
    } 
Verwandte Themen