2016-07-12 10 views
1

Kann jemand erklären, wie dieses Array nehmen:Wie mit array_map arbeiten

array(
    'Anto' => 25, 
    'Filip' => 22, 
    'Marko' => 17, 
    'Josip' => 23, 
    'Igor' => 24, 
    'Ivan' => 23, 
); 

Und wie diese Karte:

array(
    17 => [1, 'Marko'], 
    22 => [1, 'Filip'], 
    23 => [2, 'Josip', 'Ivan'], 
    24 => [1, 'Igor'], 
    25 => [1, 'Anto'], 
); 

Das neue Array enthält Tasten, die das Alter (ab dem Wert sind des Ausgangsarrays) und der Wert ist ein Array, das die Anzahl der gleichaltrigen Personen gefolgt von allen gleichaltrigen Namen enthält.

+0

versuchen, etwas selbst, wir sind hier nicht Code für Sie zu schreiben. Für den Anfang schauen Sie sich eine 'foreach'-Schleife an, die Ihnen vielleicht helfen könnte. – Nytrix

+0

betrachten Sie diese Antwort, es kann Ihnen helfen (Sie müssen nur den Zähler hinzufügen) http://StackOverflow.com/a/12706456/1437934 –

+0

Mann, ich versuche. – fvukovic

Antwort

1

foreach wird hier einfacher als array_map() sein. Ich verwende auch array_key_exists() und ksort(), um Dinge sauberer zu machen. Siehe mein dokumentiertes Beispiel unten.


Beispiel:

// Data. 
$initialArray = array(
    'Anto' => 25, 
    'Filip' => 22, 
    'Marko' => 17, 
    'Josip' => 23, 
    'Igor' => 24, 
    'Ivan' => 23, 
); 
$newArray = array(); 

// Loop. 
foreach($initialArray as $name => $age) { 
    if(!array_key_exists($age, $newArray)) { 
     // Initialize this age in the new array with empty counter. 
     $newArray[$age] = array(0); 
    } 

    // Increment the counter. 
    $newArray[$age][0]++; 

    // Append the name. 
    $newArray[$age][] = $name; 
} 

// Sort by age. 
ksort($newArray); 

// Dump. 
print_r($newArray); 

Output:

Array 
(
    [17] => Array 
     (
      [0] => 1 
      [1] => Marko 
     ) 

    [22] => Array 
     (
      [0] => 1 
      [1] => Filip 
     ) 

    [23] => Array 
     (
      [0] => 2 
      [1] => Josip 
      [2] => Ivan 
     ) 

    [24] => Array 
     (
      [0] => 1 
      [1] => Igor 
     ) 

    [25] => Array 
     (
      [0] => 1 
      [1] => Anto 
     ) 

) 

Dies ist ju Das ist eine von vielen Möglichkeiten, dies zu tun. Ich empfehle dringend mehr in die foreach Kontrollstruktur zu lesen, so dass Sie das Konzept vollständig verstehen ... es wird notwendig sein, sich als Programmierer vorwärts zu bewegen!

Sie können dies auch tun, indem Sie den Zähler am Ende Ihrer Logik hinzufügen. Zuerst würden Sie jeden Namen in einem Array basierend auf seinem Alter durchgehen und sortieren. Dann würden Sie gehen und die count($names) an den Anfang der Array bei $age Index voranstellen.

0

Sie können dafür array_walk verwenden. Hier gehen Sie:

$array = [ 
    'John' => 25, 
    'Tony' => 25, 
    'Anto' => 25, 
    'Filip' => 22, 
    'Marko' => 17, 
    'Josip' => 23, 
    'Igor' => 24, 
    'Ivan' => 23, 
]; 

$ages = []; 

array_walk($array, function ($age, $name) use (&$ages) { 
    // Does the age already exist? If so, we'll increment 
    // the count, otherwise we'll initialize it to one. 
    array_key_exists($age, $ages) ? $ages[$age][0]++ : $ages[$age][0] = 1; 

    $ages[$age][] = $name; 
}); 

var_dump($ages); 

Ausgang:

array:5 [▼ 
    25 => array:4 [▼ 
    0 => 3 
    1 => "John" 
    2 => "Tony" 
    3 => "Anto" 
    ] 
    22 => array:2 [▼ 
    0 => 1 
    1 => "Filip" 
    ] 
    17 => array:2 [▼ 
    0 => 1 
    1 => "Marko" 
    ] 
    23 => array:3 [▼ 
    0 => 2 
    1 => "Josip" 
    2 => "Ivan" 
    ] 
    24 => array:2 [▼ 
    0 => 1 
    1 => "Igor" 
    ] 
]