2017-08-14 7 views
0

J'ai deux tableaux. Je veux que je ne change pas les indices de la première et que la seconde est ajoutée par ordre dans les lacunes des indices manquants:Merge 2 tableaux: ne pas modifier les index et ajouter les 2ème valeurs dans l'ordre dans les lacunes

$a = array(
    0 => 9, 
    2 => 13 
    ); 

$b = array(
    1 => 10, 
    2 => 11, 
    3 => 12, 
    4 => 1 
    ); 

Je veux ce résultat:

$ab = array(
     0 => 9, 
     1 => 10, 
     2 => 13, 
     3 => 11, 
     4 => 12, 
     5 => 1 
    ); 

J'ai essayé ceci:

$ab = $a+$b; // Keeps indexes, but removes key 2 from array $ b 
$ab = array_merge($a, $b); // Change indexes 
$ab = array_unique(array_merge($a,$b));  // Change indexes 
$ab = array_merge($a, array_diff($b, $a)); // Change indexes 
+0

Non, ESt pas possible, j'ai simplifié l'exemple, mais $ b a un minimum de cinq valeurs et $ par 0 à 5 valeurs. – nature

Répondre

1

boucle par $b, copier les éléments à $a. Mais si l'index existe déjà, incrémentez un ajustement pour obtenir le nouvel index.

function mergeArrays($a, $b) { 
    $adjust = 0; 
    foreach ($b as $i => $val) { 
     while (isset($a[$i + $adjust])) { 
      $adjust++; 
     } 
     $a[$i + $adjust] = $val; 
    } 
    ksort($a); // Put in order by new indexes 
    return $a; 
} 

DEMO

+0

Merci Barmar! Cela fonctionne parfaitement. Plus tard, j'ai réalisé que je devais boucler et ajouter des valeurs une par une comme vous et Georaldc l'ont dit plus bas. – nature

1

Cela ne semble pas être une simple fusion. Vous pouvez probablement essayer d'exécuter une boucle à travers votre deuxième réseau et lentement en ajoutant des éléments à la première rangée dans des endroits où ils se situent

function mergeArrays($a, $b) 
{ 
    foreach ($b as $i => $v) { 
     while (array_key_exists($i, $a)) { 
      $i++; 
     } 
     $a[$i] = $v; 
    } 

    ksort($a); 

    return $a; 
} 
+0

Merci georaldc! Cela fonctionne correctement. – nature

-1
foreach ($a as $k => $v) { 
    $new_array[$k] = $v ; 
} 

foreach ($b as $k => $v) { 
    $new_array[$k] = $v ; 
} 

echo print_r(new_array); 

Espoir ce script fait de smartphone fonctionnera

+1

Je ne pense pas que cela fonctionnera. L'item 2 de b écrasera l'item 2. Et le reste de b aura le mauvais numéro de clé. – Andreas

+0

@andreas, cette approche est bonne car vous pouvez l'étendre à souhait. Exemple: vous pouvez faire somme/moyenne/tout sur les valeurs avec la même clé .. – augusto

+0

n'est pas ce genre d'évidence? Vous pouvez étendre n'importe quel code avec n'importe quel code que vous aimez. D'une manière ou d'une autre, IL NE FONCTIONNERA PAS pour l'usage prévu que veut OP. Essayez-le et vous verrez. – Andreas