2015-05-06 2 views
1
$arr1 = array(

1=>array(
    'name' => 'a', 
    'phone'=> '110', 
), 
2=>array(
    'name' => 'b', 
    'phone'=> '119', 
), 
3=>array(
    'name' => 'a', 
    'phone'=> '119', 
), 
4=>array(
    'name' => 'b', 
    'phone'=> '110', 
), 
); 

Я потратил 3 часа, чтобы понять это, и fails.I хочет объединить значение телефонов на новые массивы на основе ключевых значений имен. Результат, как этоткак упростить этот мульти-размеры ассоциативного массив?

$arr2 = array(
    1=>array(
     'name' => 'a', 
     'phone'=> array(
      1=>'110', 
      2=>'119', 
     ), 
    ), 
    2=>array(
     'name' => 'b', 
     'phone'=> array(
      1=>'110', 
      2=>'119', 
     ), 
    ) 
); 

Это не так просто, как кажется.

+1

Вот ответ, который показывает, как это сделать в Javascript: http://stackoverflow.com/questions/24302630/how-to-combine-an-array-in-javascript/24302781#24302781 Логика такая же в PHP, просто незначительные различия в синтаксисе. – Barmar

ответ

6

Вам нужно пройти через массив и создать новый.

код

<?php 

/** store the results in here **/ 
$targetArray = []; 

/** the data source **/ 
$sourceArray = [ 
    1 => [ 
     'name' => 'a', 
     'phone'=> '110', 
    ], 
    2 => [ 
     'name' => 'b', 
     'phone'=> '119', 
    ], 
    3 => [ 
     'name' => 'a', 
     'phone'=> '119', 
    ], 
    4 => [ 
     'name' => 'b', 
     'phone'=> '110', 
    ] 
]; 

foreach($sourceArray as $arr) { 
    /** create key based off name **/ 
    $targetArray[$arr['name']]['name'] = $arr['name']; 
    /** add phone numbers as they are found **/ 
    $targetArray[$arr['name']]['phone'][] = $arr['phone']; 
} 

/** reindex the array **/ 
$targetArray = array_values($targetArray); 

/** see the result **/ 
var_dump($targetArray); 

выход

array(2) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(1) "a" 
    ["phone"]=> 
    array(2) { 
     [0]=> 
     string(3) "110" 
     [1]=> 
     string(3) "119" 
    } 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(1) "b" 
    ["phone"]=> 
    array(2) { 
     [0]=> 
     string(3) "119" 
     [1]=> 
     string(3) "110" 
    } 
    } 
} 
+1

, если вы замените 'sort' на' array_values', я подниму вас – Alfwed

+0

написал это быстро, не задумываясь, но да, это определенно лучший способ. – Augwa

+0

очень освещающий и проницательный, красивые коды, спасибо большое. не может поверить, что это можно сделать таким образом. – wolfrevo

1

Вот одно решение:

// Use name as key to merge contact info. 
foreach($arr1 as $contactInfo) 
{ 
    $arr2[$contactInfo['name']]['name'] = $contactInfo['name']; 
    $arr2[$contactInfo['name']]['phone'][] = $contactInfo['phone']; 
} 

// Go back to numeric indexes. 
$arr2 = array_values($arr2); 
Смежные вопросы