сравнение двух массивов в php

Я использую этот код:

$new = array( "123" => "a", "456" => "b" ); $old = array( "123" => "a", "456" => "b" ); 

то $new массив выглядит следующим образом:

  $new = array( "456" => "b", "123" => "c", "789" => "e" ); 

так как вы видите, что счетчик $new array увеличился, и порядок элементов изменился, а значение на клавише 123 также изменилось. Мне нужно сравнить $new массив с $old array и поймать только изменение, сделанное на значение в ключе 123 не заботясь о порядке и количестве элементов. Я пытался:

  $result = array_diff( $new, $old ); print_r( $result ); 

вывод :

  Array ( [123] => c [789] => e ) 

ОБНОВИТЬ. довольно запутанным. теперь я думаю, что мы это получили

 $old = array( "123" => "a", "456" => "b" ); $new = array( "456" => "b", "123" => "c", // catch this (element in old array that is changed) "789" => "e" ); $new2 = array(); foreach ($new as $key => $new_val) { if (isset($old[$key])) // belongs to old array? { if ($old[$key] != $new_val) // has changed? $new2[$key] = $new[$key]; // catch it } } // output $new2: array ( 123 => 'c', ) 

Прежде всего вы хотите, чтобы те элементы $new которые были изменены по сравнению с $old (см. array_diff_assoc ):

 $changed = array_diff_assoc($new, $old); 

Из этого результата вы хотите иметь только те элементы, у которых есть ключ в $old (см. array_intersect_key ):

 $result = array_intersect_key($changed, $old); 

Вот и все. Вы можете обернуть это друг в друга, если это поможет:

 array_intersect_key(array_diff_assoc($new, $old), $old); 

Результат:

 array(1) { [123] => string(1) "c" } 

Полный пример ( демо ):

 $old = array( "123" => "a", "456" => "b" ); $new = array( "456" => "b", "123" => "c", // catch only the change made on the value at key 123 "789" => "e" ); $changed = array_diff_assoc($new, $old); $result = array_intersect_key($changed, $old); var_dump($result); 

Просто последнее замечание: в PHP много функций массива. Стоит пройти через список и посмотреть, что подходит, потому что чаще всего вам нужно только один или два из них, чтобы получить такие вещи, как это сделано.

Вы используете этот код для своих требований

  <?php function key_compare_func($key1, $key2) { if ($key1 == $key2) return 0; else if ($key1 > $key2) return 1; else return -1; } $array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4); $array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8); var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func')); ?>