Search code examples
phparraysmergemultidimensional-arrayassociative

PHP multiple arrays to one associative array


How can I merge this three arrays

$name ={"Tom", "John", "David"};
$v1 = {"Tom":100, "David":200};
$v2 = {"John":500, "Tom":400};

into one multidimensional associative array in two different ways? One way is the key order should be same as that of array "name".

$name_merged_original_order = array (
    "Tom" => Array(
        "v1" => 100,
        "v2" => 400
    ),
    "John" => Array(
        "v1" => "N/A",
        "v2" => 500
    ),
    "David" => Array(
        "v1" => 100,
        "v2" => "N/A"
    )
)

Another ways is the alphabetical of array "name":

$name_merged_asc = array (
    "David" => Array(
        "v1" => 100,
        "v2" => "N/A"
    ),
    "John" => Array(
        "v1" => "N/A",
        "v2" => 200
    ),
    "Tom" => Array(
        "v1" => 100,
        "v2" => 400
    ),
)

The tricky part is that array "v1" and "v2" is not ordered as the key of "name." They also don't have all keys as in "name." Thanks!


Solution

  • It's not tested and the easiest solution:

    $name_merged_original_order = array();
    foreach($name as $key){
        $name_merged_original_order[$key] = array();
        if(array_key_exists($key, $v1)){
            $name_merged_original_order[$key]['v1'] = $v1[$key];
        }
        else{
            $name_merged_original_order[$key]['v1'] = 'N/A';
        }
        if(array_key_exists($key, $v2)){
            $name_merged_original_order[$key]['v2'] = $v2[$key];
        }
        else{
            $name_merged_original_order[$key]['v2'] = 'N/A';
        }
    }
    
    sort($name);
    $name_merged_asc = array();
    foreach($name as $key){
        $name_merged_asc[$key] = array();
        if(array_key_exists($key, $v1)){
            $name_merged_asc[$key]['v1'] = $v1[$key];
        }
        else{
            $name_merged_asc[$key]['v1'] = 'N/A';
        }
        if(array_key_exists($key, $v2)){
            $name_merged_asc[$key]['v2'] = $v2[$key];
        }
        else{
            $name_merged_asc[$key]['v2'] = 'N/A';
        }
    }