2013-08-12 1 views
0

Je veux comparer deux tableaux dans php. Mon tableau ressemble à ceciArray Comparaison dans Php, et trouver les valeurs de diff

Array ( 
[0] => Array ([Id] => 1 [row1] => 1458) 
[1] => Array ([Id] => 2 [row1] => 16) 
[2] => Array ([Id] => 3 [row1] => 115) 
[3] => Array ([Id] => 4 [row1] => 18) 
[4] => Array ([Id] => 5 [row1] => 13) 
[5] => Array ([Id] => 6 [row1] => 13) 
[6] => Array ([Id] => 7 [row1] => 131) 
) 

Array ( 
[0] => Array ([Id] => 1 [row1] => 158) 
[1] => Array ([Id] => 2 [row1] => 165) 
[2] => Array ([Id] => 3 [row1] => 111) 
[3] => Array ([Id] => 4 [row1] => 186) 
[4] => Array ([Id] => 5 [row1] => 3) 
) 

Premièrement, la taille de array1 et les tailles de array2 n'étaient pas toujours égales. identifiant dans array1 peut ou non présent dans array2, si la valeur est absente, la fonction doivent imprimer l'indice total array3, comme

[someindex] => Array ([Id] => 6 [row1] => 13) 

si elle est présente, la fonction doit soustraire la ligne1 de Array1 à row1 de array2 et impression dans array3, comme celui-ci

[someindex] => Array ([Id] => 1 [row1] => 1300) 

et ma sortie finale devrait être,

Array ( 
[0] => Array ([Id] => 1 [row1] => 1300) 
[1] => Array ([Id] => 2 [row1] => -149) 
[2] => Array ([Id] => 3 [row1] => 4) 
[3] => Array ([Id] => 4 [row1] => -168) 
[4] => Array ([Id] => 5 [row1] => 10) 
[5] => Array ([Id] => 6 [row1] => 13) 
[6] => Array ([Id] => 7 [row1] => 131) 
) 

quelqu'un peut me aider à résoudre ce problème.

Répondre

0

D'abord, vous avez soit pour rendre le deuxième tableau consultable en utilisant la valeur Id comme les clés ou écrire une fonction de recherche. Je choisis l'ancien:

$searchable = array_reduce($array2, function(&$result, $item) { 
    return $result + array($item['Id'] => $item['row1']); 
}, array()); 

La fonction array_reduce() commence par un tableau vide et construit à l'aide de l'opérateur d'addition de tableau; cela crée un tableau qui peut être déréférencé en utilisant l'identifiant.

Ensuite, vous effectuez une opération de carte sur le premier tableau:

$array3 = array_map(function($item) use ($searchable) { 
    $value = isset($searchable[$item['Id']]) ? $searchable[$item['Id']] : 0; 
    $item['row1'] -= $value; 
// $item['row2'] = $item['row1'] - $value; 
    return $item; 
}, $array1); 

Faire une opération de carte conserve le tableau original et crée une nouvelle avec les valeurs que vous choisissez dans une fonction de rappel.

+0

Jack Merci, Ceci est ce que je veux parfaitement. – Sreenath

+0

Mais, et si j'avais 10000 d'enregistrements dans mon tableau? cela prend-il du temps? – Sreenath

+0

@Sreenath Mes tests ont montré que cette méthode est 75% plus lente que la mienne. Moyenne avec les chiffres ci-dessus = 0,145, moyenne avec les miens = 0,083. Bien que pour être juste, je ne suis pas sûr à quelle taille les lacunes commencent vraiment à apparaître, donc cela dépend de la taille des tableaux que vous utilisez – SmokeyPHP

0

Je ne sais pas si ce exactement ce que vous voulez, mais vous pouvez vérifier si une clé existe avec array_key_exists:

$array3 = array(); 
foreach ($array1 as $k => $v) { 
     if (array_key_exists($k, $array2)) { 
      $array3[] = $v - $array2[$k]; 
     } else { 
      $array3[] = $v; 
     } 
    } 
1
$arr1 = Array ( 
    0 => Array ('Id' => 1, 'row1' => 1458) 
    ,1 => Array ('Id' => 2, 'row1' => 16) 
    ,2 => Array ('Id' => 3, 'row1' => 115) 
    ,3 => Array ('Id' => 4, 'row1' => 18) 
    ,4 => Array ('Id' => 5, 'row1' => 13) 
    ,5 => Array ('Id' => 6, 'row1' => 13) 
    ,6 => Array ('Id' => 7, 'row1' => 131) 
); 
$arr2 = Array ( 
    0 => Array('Id' => 1, 'row1' => 158) 
    ,1 => Array('Id' => 2, 'row1' => 165) 
    ,2 => Array('Id' => 3, 'row1'=> 111) 
    ,3 => Array('Id' => 4, 'row1' => 186) 
    ,4 => Array('Id' => 5, 'row1' => 3) 
); 
$final = array(); 
foreach($arr1 as $k => $sec) 
{ 
    $sub = 0; 
    foreach($arr2 as $sec2) 
    { 
     if($sec2['Id']==$sec['Id']) 
     { 
      $sub = $sec2['row1']; 
      break; 
     } 
    } 
    $sec['row1'] -= $sub; 
    //Or to save to another element: 
    //$sec['row2'] = $sec['row1']-$sub; 
    $final[] = $sec; 
} 

echo '<pre>'.print_r($final,true).'</pre>'; 

Sortie:

Array ( 
    [0] => Array ([Id] => 1 [row1] => 1300) 
    [1] => Array ([Id] => 2 [row1] => -149) 
    [2] => Array ([Id] => 3 [row1] => 4) 
    [3] => Array ([Id] => 4 [row1] => -168) 
    [4] => Array ([Id] => 5 [row1] => 10) 
    [5] => Array ([Id] => 6 [row1] => 13) 
    [6] => Array ([Id] => 7 [row1] => 131) 
) 
+0

Merci, ça a marché. – Sreenath

+1

@Sreenath Notez que la valeur Id réelle n'est pas utilisée pour la recherche. –

+0

@Jack Je viens de remarquer ce que vous voulez dire - clairement trop tôt pour moi encore ... – SmokeyPHP

0

Cela crée un tableau d'indexation ($new) dans le cas où les clés principales ne correspondent pas dans les tableaux d'origine.

$arr = array ( 
    0 => array ('Id' => '1','row1' => 1458), 
    1 => array ('Id' => '2','row1' => 16), 
    2 => array ('Id' => '3','row1' => 115), 
    3 => array ('Id' => '4','row1' => 18), 
    4 => array ('Id' => '5','row1' => 13), 
    5 => array ('Id' => '6','row1' => 13), 
    6 => array ('Id' => '7','row1' => 131)); 
$arr2 = array ( 
    0 => array ('Id' => '1','row1' => 158), 
    1 => array ('Id' => '2','row1' => 165), 
    2 => array ('Id' => '3','row1' => 111), 
    3 => array ('Id' => '4','row1' => 186), 
    4 => array ('Id' => '5','row1' => 3)); 
$new = array(); 
foreach ($arr2 as $key => $value){ 
    $new[$value['Id']] = $value['row1']; 
} 
foreach ($arr as $key => $value){ 
    if (isset($new[$value['Id']])){ 
     $arr[$key]['row1'] -= $new[$value['Id']]; 
    } 
} 
print_r($arr);