2016-11-26 3 views
2

Ich habe ein Array mit dieser Struktur:Gruppe Arrays basierend auf ähnlichen Werten in PHP

<?php 
$grades = array(
     'Grade 1' => array(
      'title' => 'Grade 1 Class', 
      'students' => 5, 
      'teacher' => 'Smith', 
     ), 
     'Grade 2' => array(
      'title' => 'Grade 2 Class', 
      'students' => 5, 
      'teacher' => 'Smith', 
     ), 
     'Grade 3' => array(
      'title' =>'Grade 3 Class', 
      'students' => 5, 
      'teacher' => 'John', 
     ) 
    ); 

wo ich Gruppe sie auf bestimmte Eigenschaften basieren soll. Zum Beispiel zur Gruppe aller Qualitäten, die gleiche Anzahl von Studenten haben wären:

Grade 1 Class - Grade 3 Class  5 

ich durch das Array wie folgt bekommen:

foreach ($grades as $key => $value) { 
    $return[$value['students']][] = $value['title']; 
} 

foreach ($return as $key => $value) { 
    echo implode(' - ', $value)."\t\t".$key; 
} 
// output is 
// Grade 1 Class - Grade 2 Class - Grade 3 Class  5 

aber der obige Code gibt die Mittelstufe als auch, wie kann Ich gebe nur das erste und das letzte Element aus, um die gewünschte Ausgabe zu erhalten, vorausgesetzt, wir wissen vielleicht nicht, wo ähnliche Werte auftreten.

Zum Beispiel für this array dies ist die gewünschte Ausgabe:

Grade 1 Class - Grade 2 Class  5 
Grade 3 Class - Grade 6 Class  8 
Grade 7 Class      9 
Grade 8 Class - Grade 9 Class  4 
+0

Können Sie ein Array erstellen, die Sie auch ausgegeben werden sollen, bitte? – Pachonk

+0

@Pachonk Ich möchte kein anderes Array nach dem ursprünglichen Array erstellen, ich möchte sie nur in Gruppen ausgeben. –

+0

Ahh, okay, ich verstehe es jetzt. – Pachonk

Antwort

0

Wie in Frage erwähnt, müssen Sie nur die erste und letzte Element. Zuerst müssen Sie das Array nach der Studenten-ID gruppieren und dann das erste und das letzte Element ausdrucken. Ich habe Ihren Code aktualisieren als -

$grades = array(
    'Grade 1' => array(
     'title' => 'Grade 1 Class', 
     'students' => 5, 
     'teacher' => 'Smith', 
    ), 
    'Grade 2' => array(
     'title' => 'Grade 2 Class', 
     'students' => 5, 
     'teacher' => 'Smith', 
    ), 
    'Grade 3' => array(
     'title' =>'Grade 3 Class', 
     'students' => 8, 
     'teacher' => 'John', 
    ), 
    'Grade 4' => array(
     'title' =>'Grade 4 Class', 
     'students' => 8, 
     'teacher' => 'John', 
    ), 
    'Grade 5' => array(
     'title' =>'Grade 5 Class', 
     'students' => 8, 
     'teacher' => 'John', 
    ), 
    'Grade 6' => array(
     'title' =>'Grade 6 Class', 
     'students' => 8, 
     'teacher' => 'John', 
    ), 
    'Grade 7' => array(
     'title' =>'Grade 7 Class', 
     'students' => 9, 
     'teacher' => 'John', 
    ), 
    'Grade 8' => array(
     'title' =>'Grade 8 Class', 
     'students' => 4, 
     'teacher' => 'John', 
    ), 
); 

$newArray = array(); 
$keyIndex = 0; 
$s = null; 
foreach ($grades as $key => $value) { 
    if($s != $value['students']){ 
     $keyIndex++; 
    } 
    $newArray[$keyIndex][] = $value; 
    $s = $value['students']; 
} 

foreach ($newArray as $student => $data) { 
    $gradeFirst = key($data); 
    // Check there are multiple grade or single grade 
    if(count($data) > 1){ 
     $lastGrade = end($data); 
     echo $data[$gradeFirst]['title'].' - '.$lastGrade['title'] .' '. $lastGrade['students']; 
    } 
    else{ 
     echo $data[$gradeFirst]['title'] .' '. $data[$gradeFirst]['students']; 
    } 
    echo "<br>"; 
} 

Erste Schleife Gruppe alle Elemente nach Student. Zweite Loop-Druckausgabe auf dem Bildschirm. Wenn die Bedingung in der zweiten Schleife hinzugefügt wird, um zu überprüfen, ob für einen Schüler eine einzelne oder mehrere Klassen vorhanden sind.

Es zurückkehren Ausgabe als

Grade 1 Class - Grade 2 Class 5 
Grade 3 Class - Grade 6 Class 8 
Grade 7 Class 9 
Grade 8 Class 4 
+0

danke für deine Antwort, es gibt einen Fehler in deinem Code, zum Beispiel, wenn du es mit [diesem Array] (http://pastebin.com/raw/TzJCVstA) aus den möglichen Szenarien ausführst, bekommst du eine falsche Ausgabe –

+0

Danke für den Bericht Fehler. Ich habe den Fehler behoben. –

+0

Ich denke, ich fand einen anderen Fehler, [dieses Beispiel prüfen] (http://pastebin.com/raw/ppjUYjcY) und Sie können sehen, das Ergebnis ist falsch –

0

Dies funktioniert für mich

<?php 

$grades = array(
     'Grade 1' => array(
      'title' => 'Grade 1 Class', 
      'students' => 5, 
      'teacher' => 'Smith', 
     ), 
     'Grade 2' => array(
      'title' => 'Grade 2 Class', 
      'students' => 5, 
      'teacher' => 'Smith', 
     ), 
     'Grade 3' => array(
      'title' =>'Grade 3 Class', 
      'students' => 8, 
      'teacher' => 'John', 
     ), 
     'Grade 4' => array(
      'title' =>'Grade 4 Class', 
      'students' => 5, 
      'teacher' => 'Tina', 
     ) 
    ); 


foreach ($grades as $outer_k => $outer_v) { 
    // hold current $outer_k and start looping through $grades agaain, doing 
    // comparison 
    foreach ($grades as $inner_k => $inner_v) { 
     // check inner_k is not comparing itself to itself 
     if ($inner_k !== $outer_k) { 
      if ($inner_v['students'] === $outer_v['students']) { 
       $matches[] = $inner_v['title']; 
       $num_students = $inner_v['students']; 
      } 
     } 
    } 
} 

sort($matches); 
$result = array_unique($matches); 
$result = array_values($result); 

$length = count($result) - 1; 
echo $result[0] . " - " . $result[$length] . "\t\t{$num_students}\n"; 

erzeugt diese Ausgabe:

Grade 1 Class - Grade 4 Class   5 
+0

danke für die Antwort, dies gibt nicht alle möglichen Werte aus. Ich werde die Frage so ändern, dass sie die gewünschte Ausgabe widerspiegelt. –

Verwandte Themen