[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как сравнить не только ключи массивов,
SergSerg
Как сравнить не только ключи массивов, но и их последовательность (правильное, заданное местоположение в массиве)?
Есть два массива, из которых $array1 эталонный:
$array1 = array('green' => 1, 'red' => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'red' => 6, 'yellow' => 7, 'purple' => 8);

//Как мы видим третий ключ 'yellow
'
во втором массиве $array2 не совпадает с последовательностью ключей в первом эталонном массиве.

Задача: как, сравнивая два массива, выявить расхождение в местоположении ключей?
(так же принимаем условие, что нам совершенно не важны значения в данных массивах)

Я попробовал так:

function key_compare_func($key1, $key2)
{
if ($key1 == $key2)
echo "ключ ".$key2." в массиве array2 находится на месте <br>";
else
echo "ключ ".$key2." в массиве array2 находится НЕ на месте <br>";
}
array_diff_ukey($array1, $array2, 'key_compare_func');


но что то у меня не «вытанцовывается» :)

буду признателен за помощь........



Спустя 8 минут, 34 секунды (9.08.2012 - 19:29) SergSerg написал(а):
выше показанный код выдает результат:

ключ green в массиве array2 находится НЕ на месте
ключ red в массиве array2 находится НЕ на месте
ключ green в массиве array2 находится НЕ на месте
ключ red в массиве array2 находится НЕ на месте
ключ red в массиве array2 находится НЕ на месте
ключ yellow в массиве array2 находится НЕ на месте
ключ purple в массиве array2 находится на месте
ключ purple в массиве array2 находится НЕ на месте
ключ purple в массиве array2 находится НЕ на месте


Спустя 23 минуты, 4 секунды (9.08.2012 - 19:52) pak написал(а):
var_dump(array_intersect_key($array1, $array2));

Покажет только совпадение.

Спустя 7 минут, 33 секунды (9.08.2012 - 20:00) SergSerg написал(а):
Цитата (pak @ 9.08.2012 - 17:52)
var_dump(array_intersect_key($array1, $array2));

Покажет только совпадение.

спасибо!!!

Спустя 4 минуты, 6 секунд (9.08.2012 - 20:04) SergSerg написал(а):
Цитата (pak @ 9.08.2012 - 17:52)
var_dump(array_intersect_key($array1, $array2));

Покажет только совпадение.

а как сделать, что бы сообщение выдавалось, примерно такое:

ВНИМАНИЕ: ключ $key находится НЕ на месте!

Спустя 1 час, 7 минут, 52 секунды (9.08.2012 - 21:12) SergSerg написал(а):
в общем у меня получилось следующее:

	$array1 = array('green' => 1, 'red' => 2, 'yellow' => 3, 'purple' => 4,);
$array2 = array('green' => 5, 'yellow' => 7, 'red' => 6, 'purple' => 8,);

function compare_array_data($a1, $a2) {
reset($a1); // установили внутренний указатель массива на его первый элемент
reset($a2); // установили внутренний указатель массива на его первый элемент
// each - Возвратить текущую пару ключ/значение из массива и сместить его указатель

while( ( $e1=each($a1) ) && ( $e2=each($a2) ) ) {
if ( $e1["key"] !== $e2["key"] ) {
return $e2["key"];
}
}

return true;
}
$result = compare_array_data($array1, $array2);
if($result === true)
{
// массивы идентичны
echo 'последовательность ключей в массивах идентична';
}
else
{
// в массивах есть расхождение
echo 'в последовательности ключей в массивах обнаружено расхождение!<br>';
echo '!!!ВНИМАНИЕ: '.$result.' - этот ключ не на своем месте!';
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.