Я использую этот код:
$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')); ?>