2011-08-22 15 views
8

tengo una matriz que se parece a esto:cómo prevenir array_merge volver a numerar las teclas numéricas

Array ( 
    [0] => Array ([unit_id] => 1 [unit_name] => Clown Fish) 
    [1] => Array ([unit_id] => L [unit_name] => Liter) 
    [2] => Array ([unit_id] => 2 [unit_name] => Elephant ) 
    [3] => Array ([unit_id] => 3 [unit_name] => Water Bottle) 
    [4] => Array ([unit_id] => 4 [unit_name] => Office Seating) 
    [5] => Array ([unit_id] => 5 [unit_name] => Green Green Grass) 
) 

entonces, he escrito una función

function array_to_list($arr_data, $str_key, $str_value) { 
    $arr_list = array(); 
    if (is_array($arr_data)) { 
     foreach($arr_data as $arr_value) { 
      if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) { 
       $arr_list = array_merge($arr_list, array($arr_value[$str_key] => $arr_value[$str_value])); 
      } 
     } 
    } 
    return $arr_list; 
} 

para convertir la matriz para tener este aspecto

Array ( 
    [1] => Clown Fish) 
    [L] => Liter) 
    [2] => Elephant) 
    [3] => Water Bottle) 
    [4] => Office Seating) 
    [5] => Green Green Grass) 
) 

pero la salida, en cambio, es

Array ( 
    [0] => Clown Fish) 
    [L] => Liter) 
    [1] => Elephant) 
    [2] => Water Bottle) 
    [3] => Office Seating) 
    [4] => Green Green Grass) 
) 

supongo que esto tiene algo que ver con la naturaleza de array_merge, que según php manual "Los valores en la matriz de entrada con claves numéricas se volverán a numerar con incrementos de teclas comenzando desde cero en la matriz de resultados".

¿hay alguna manera de poder producir el resultado deseado con o sin array_merge?

+3

http://www.programmingfacts.com/merging-arrays-with-reindex-and-without-reindexing/ – PlagueEditor

+0

gracias por responder tan rápido. es embarazoso para mí ver que la solución es tan simple, pero no puedo encontrarla cuando busco en Google hace un tiempo. gracias. – dqiu

Respuesta

2

¿Por qué no acaba de tratar un enfoque mucho más simple:

function array_to_list($arr_data, $str_key, $str_value) { 
    $arr_list = array(); 
    if (is_array($arr_data)) { 
     foreach($arr_data as $arr_value) { 
      if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) { 

       // This is the changed line: 
       $arr_list[ $arr_value[$str_key] ] = $arr_value[$str_value]; 

      } 
     } 
    } 
    return $arr_list; 
} 

Esto sólo establece los valores en la salida matriz directamente. No hay razón para crear una nueva matriz y fusionarla cada vez. También debería ser un poco más rápido.

+0

me pregunto por qué su solución no vino a mi cabeza antes. Gracias. siendo más rápido, creo que puedo ahorrar sobrecarga en lugar de hacerlo con la anterior. – dqiu

0

caer el array_merge() y anexar la key y value de nuevo $arr_list

function array_to_list($arr_data, $str_key, $str_value) { 
    $arr_list = array(); 
    if (is_array($arr_data)) { 
     foreach($arr_data as $arr_value) { 
      if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) { 
       $arr_list[$arr_value[$str_key]] = $arr_value[$str_value]; 
      } 
     } 
    } 
    return $arr_list; 
} 
+0

o como @PlagueEditor dijo: '' $ arr_list = $ arr_list + (array ($ arr_value [$ str_key] => $ arr_value [$ str_value])) '' –

+0

estoy usando ambos en realidad: D. una especie de ejercicio para mí. gracias. – dqiu

14

el uso del operador '+' en lugar de array_merge():

function array_to_list($arr_data, $str_key, $str_value) { 
$arr_list = array(); 
if (is_array($arr_data)) { 
    foreach($arr_data as $arr_value) { 
     if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) { 
      $arr_list = $arr_list + array($arr_value[$str_key] => $arr_value[$str_value]); 
     } 
    } 
} 
return $arr_list; 

}

+1

Esto era exactamente lo que necesitaba (para un propósito más simple) ... anteponer una tecla '0' a una matriz con teclas numéricas sin renumerar las teclas. – lhagemann

+0

+1 por simplicidad y precisión – Marecky

Cuestiones relacionadas