2016-04-19 4 views
1

Ich habe schon eine Weile gekämpft. Ich habe 2 Arrays, die ich miteinander vergleichen möchte. Ein Benutzerarray und ein Unterrichtsarray. Die Schlüssel in der Lektion Array sind die IDs dieser LektionVergleichen Sie 2 PHP-Arrays und filtern Sie die Ergebnisse aus

Lektion Array:

Array(
    // The key in this array ([143] or [13]) is the lesson ID each lesson contains one ore more topics 
    [143] => Array (
     [0] => 315 // example: 315 is a topic ID within lesson 143 
     [1] => 311 
     [2] => 176 
     [3] => 145 
    ) 

    [13] => Array (
     [0] => 27 
     [1] => 25 
    ) 
) 

Das Array Benutzer enthält nur die Informationen darüber, welche Themen, die Benutzer abgeschlossen hat. Themen mit Unterrichts-IDs, die nicht abgeschlossen wurden, sind in diesem Array nicht vorhanden.

Hauptfrage: Ich möchte die Themen-IDs des Benutzerarrays mit dem Lektionsarray vergleichen. Und ich möchte die Themen, die nicht abgeschlossen sind, in einem separaten Array ablegen.

Benutzer Array

Array (
    [0] => Array (
     [143] => Array (
      [145] => 1 // (this 1 means it is completed, this key is a topic ID) 
      [176] => 1 
     ) 
    ) 

    [1] => Array (
     [13] => Array (
      [25] => 1 
     ) 
    ) 

) 

In diesem Beispiel über dem Ergebnis i bekommen möchte, ist ein Array mit nicht passenden ids wie:

$result = array(143 => array(311,315), 13 => array(27)) 

ich, es ist ein wenig klar hoffen.

Wenn mir jemand in die richtige Richtung zeigen kann, werde ich sehr froh sein! Ich habe viele Dinge ausprobiert, aber um sie hier zu veröffentlichen, klärt sie nicht die Hauptfrage auf.

+0

Sie mit Benutzer-Array starten haben, überprüfen Sie den ersten Index '143' in der Lektion Array ist oder nicht? Wenn ja, dann überprüfen Sie die Werte, wenn nicht, dann speichern Sie sie im 'Ergebnis-Array'. –

+0

Das Beispielergebnis, das Sie uns gegeben haben, listet nur Themen auf, die von keinem Benutzer ausgefüllt wurden. Ist das wirklich das, was Sie wollen, oder wäre es nicht realistischer, ein solches Array von fehlenden Themen pro Benutzer auszugeben? – flowit

+0

Das $ result enthält bereits Informationen über einen eindeutigen Benutzer. Also muss ich die Themen kennen, die nicht abgeschlossen wurden, damit ich den Benutzer starten kann, wo er geblieben ist. – Paul

Antwort

4

müssen Sie array_keys und array_diff verwenden. Online kompilieren bei My answer

Arrays

$lesson = array(
    "143" => array("315", "311", "176", "145"), 
    "13" => array("27", "25") 
); 

$user = array(
    array("143" => array("145" => "1", "176" => "1")), 
    array("13" => array("25" => "1")) 
); 

Mechanism/Prozess

$result = array(); 
foreach ($user as $key => $value) { 
    foreach ($value as $key2 => $value2) { 
     $result[$key2] = array_diff($lesson[$key2], array_keys($value2)); 
    } 
} 

Ergebnis

echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

Ausgabe

Array 
    (
     [143] => Array 
     (
      [0] => 315 
      [1] => 311 
     ) 
     [13] => Array 
     (
      [0] => 27 
     ) 
) 
+1

Nice one! Ich werde das sofort überprüfen. Aber es sieht so aus, als ob es genau das ist, was ich meinte. – Paul

+1

Schön es funktioniert !! Vielen vielen Dank für die Heilung meiner Kopfschmerzen ;-) – Paul

-1

Das erste, was ich tun würde, ist das User-Array ändern wahrscheinlich mit array_flip(), so dass ich mit etwas so enden würde:

Array (
    [0] => Array (

      [143] => Array (
       [0] => 145 
       [1] => 176 
      ) 

    ) 

    [1] => Array (

      [13] => Array (
       [0] => 25 
      ) 

    ) 

Sobald das erledigt ist, alles, was Sie tun müssen, ist, verwenden Sie die array_diff() Funktion, um die beiden Arrays zu vergleichen und Sie werden, was Element nur in der ersten Reihe ist:

$diff = array_diff($lesson[143], $user[0][143]) 

ich hoffe, das hilft.

+1

'array_flip' on User produzieren kann nicht funktionieren, weil alle Werte 1 sind. – fusion3k

+0

ja, deshalb verwende ich' array_keys'. –

Verwandte Themen