2012-03-02 11 views
5

De acuerdo, si siente que esto debería ser realmente simple y realizado por una función como array_merge() o array_merge_recursive, pero no puedo entenderlo. Tengo dos matrices simples estructuradas como el ejemplo (simplificado) a continuación. Simplemente quiero fusionarlos en una matriz basada en su índice.Fusionando dos matrices por índice

$ array 1:

Array ( 
    [0] => Array ( 
     [ID] => 201 
     [latLng] => 45.5234515, -122.6762071 
) 
    [1] => Array ( 
     [ID] => 199 
     [latLng] => 37.7931446, -122.39466520000002 
) 
) 

etcétera ...

$ matriz2:

Array ( 
    [0] => Array ( 
     [distance] => 1000 
     [time] => 10 
) 
    [1] => Array ( 
     [distance] => 1500 
     [time] => 15 
) 
) 

$ desiredResult:

Array ( 
    [0] => Array ( 
     [ID] => 201 
     [latLng] => 45.5234515, -122.6762071 
     [distance] => 1000 
     [time] => 10 
) 
    [1] => Array ( 
     [ID] => 199 
     [latLng] => 37.7931446, -122.39466520000002 
     [distance] => 1500 
     [time] => 15 
) 
) 

Cuando trato de combinar éstos el uso de combinar funciones, sólo puedo conseguir esto:

$ unDesiredResult:

Array ( 
    [0] => Array ( 
     [ID] => 201 
     [latLng] => 45.5234515, -122.6762071 
) 
    [1] => Array ( 
     [ID] => 199 
     [latLng] => 37.7931446, -122.39466520000002 
) 
    [2] => Array ( 
     [distance] => 1000 
     [time] => 10 
) 
    [3] => Array ( 
     [distance] => 1500 
     [time] => 15 
) 
) 

¿Es necesario que recorrer para empujar el segundo set en el primer , o puede hacerse con una función existente?

Respuesta

4

No creo que haya una función para hacer esto por ti, vas a tener que repetir.

$result = array(); 
foreach($array1 as $key=>$val){ // Loop though one array 
    $val2 = $array2[$key]; // Get the values from the other array 
    $result[$key] = $val + $val2; // combine 'em 
} 

O puede empujar los datos en $ matriz1, por lo que necesita para hacer una tercera matriz:

foreach($array1 as $key=>&$val){ // Loop though one array 
    $val2 = $array2[$key]; // Get the values from the other array 
    $val += $val2; // combine 'em 
} 
+0

Así que tengo que recorrer (siempre Asumo que hay una manera más rápida que Estoy perdido). Gracias, esto funciona perfectamente (como puede ser la respuesta a continuación, pero voy por el más simple). – Kerri

+0

@Kerri: No pude encontrar una función incorporada que hiciera lo que quisiera. 'array_merge_recursive' no da el resultado deseado. –

+0

@Kerri: 'array_merge_recursive' funcionaría si sus matrices tuvieran [claves de cadena] (http://ideone.com/xZQYd) (no [teclas numéricas] (http: // ideone.com/s8mHI)); –

3

Tendrá que utilizar un bucle. Trate de crear una función:

function addArray(array &$output, array $input) { 
    foreach($input as $key => $value) { 
     if(is_array($value)) { 
      if(!isset($output[$key])) 
       $output[$key] = array(); 
      addArray($output[$key], $value); 
     } else { 
      $output[$key] = $value; 
     } 
    } 
} 

continuación:

$combinedArray = array(); 
addArray($combinedArray, $array1); 
addArray($combinedArray, $array2); 
+0

+1 para +1 para +1 para +1 para ... recursividad. –

+0

¿No sería más fácil simplemente hacer 'addArray ($ array1, $ array2);'? –

0

me gustaría ir sobre esto de forma ligeramente diferente, con un intervalo. Esto supone que sus valores están siempre cerradas y que el primer registro de array1 siempre se corresponde con el primer registro de matriz2:

$i = 0; // sets counter 
$end = count($array1); // finds record number 
while($i <= $end){ //for each record in the array 
    $array1[$i]['distance'] = $array2[$i]['distance']; //match up array values 
    $array1[$i]['time'] = $array2[$i]['time']; //match up array values 
    $i++; //iterate 
} 

buena suerte!

+1

Gracias. Esto también funcionaría bien, y las suposiciones funcionarían en mi caso de uso. Pero en realidad hay un conjunto de claves/valores que se establecen más que en mis matrices de ejemplo, por lo que esto terminaría siendo más engorroso de codificar (y menos flexible). Pero sería bueno si mis matrices fueran tan simples como en mi ejemplo. – Kerri

+0

¡Gracias por los comentarios! – AshBrad

2

ejemplo matrices tiene que ser fusionado:

[location_coordinates] => Array 
           (
            [0] => 36.037939100000,-78.905221600000 
            [1] => 36.004398400000,-78.936084600000 
           ) 

          [tm_field_reference_locations$field_location_address$city] => Array 
           (
            [0] => Durham 
            [1] => Durham 
           ) 

          [doctor_city] => Array 
           (
            [0] => Durham 
            [1] => Durham 
           ) 

          [tm_field_reference_locations$field_location_address$street] => Array 
           (
            [0] => 407 Crutchfield Street 
            [1] => 40 Duke Medicine Circle 
           ) 

          [tm_field_reference_locations$field_office_phone] => Array 
           (
            [0] => 919-479-4120 
            [1] => 919-613-0444 
           ) 

          [sm_field_reference_locations$title] => Array 
           (
            [0] => Duke Regional Hospital Spine and Neurosciences 
            [1] => Duke Spine Center 
           ) 

Cuando bucle, como a continuación:

 $address= array(); 
for($n=0; $n<sizeof($kolDetails['location_coordinates']); $n++){ 
    $address[$n]['org_institution_id']=$kolDetails['sm_field_reference_locations$title'][$n]; 
    $address[$n]['longitude']=$kolDetails['location_coordinates'][$n]; 
    $address[$n]['City']=$kolDetails['doctor_city'][$n]; 
    $address[$n]['address1']=$kolDetails['tm_field_reference_locations$field_location_address$street'][$n];     
    $address[$n]['phone_number']=$kolDetails['tm_field_reference_locations$field_office_phone'][$n];   
    } 
    $kolextra['adress']=$address; 
    pr($kolextra['adress']); 
    $address = array();