2016-07-12 2 views
1

Может кто-нибудь объяснить, как принять этот массив:Как работать с array_map

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

И карта это так:

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

Новый массив содержит ключи, возраст (от стоимости исходного массива), а значение представляет собой массив, содержащий число людей с одинаковым возрастом, за которым следуют все имена одного возраста.

+0

попробовать что-то сами, мы здесь не писать код для вас. Для начала посмотрите на цикл foreach, который может вам помочь. – Nytrix

+0

Посмотрите на этот ответ, он может вам помочь (вам нужно только добавить счетчик) http://stackoverflow.com/a/12706456/1437934 –

+0

Человек, который пытается. – fvukovic

ответ

1

foreach будет проще, чем array_map() здесь. Я также использую array_key_exists() и ksort(), чтобы сделать вещи чище. См. Мой документированный пример ниже.


Пример:

// 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); 

Выход:

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 
     ) 

) 

Это Ju Это один из многих способов сделать это. Я настоятельно рекомендую прочитать больше в структуре управления , чтобы вы поняли концепцию полностью ... нужно будет двигаться вперед как программист!

Вы также можете сделать это, добавив счетчик в конце вашей логики. Во-первых, вы проходите и сортируете каждое имя в массив, основанный на их возрасте. Затем вы пройдете и добавьте count($names) в начало массива $names с индексом $age.

0

Для этого можно использовать array_walk. Здесь вы идете:

$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); 

Выход:

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" 
    ] 
] 
Смежные вопросы