[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите понять логику array_diff_uassoc
Страницы: 1, 2
qwer123
Здравствуйте уважаемые форумчане, очень нуждаюсь в вашей помощи! Я пишу аналог ф-и array_diff_uassoc(пишу, чтобы лучше понимать и и уметь кодить), в общем написал и при глубоком тестировании выяснил, что моя ф-я дает сбой!


При ситуации

$q = function (){};
$array1 = array(1,2,3,4);
$array2 = array(1,2,3);

print_r(array_diff_uassoc($array1, $array2, $q));
print_r(my_array_diff_uassoc($array1, $array2, $q));


Получаются такие выводы

Array
(
[0] => 1
[1] => 2
[3] => 4
)

и соответственно моя ф-я выдает

Array
(
[3] => 4
)

Еще интересней получается когда когда пихаешь смешанные массивы,где и объекты и некоторые параметры массивов тоже массивы содержат, а так же нулл и параметры булева типа!

Очень прошу, помогите разобраться, заранее всем спасибо за помощь!
sergeiss
Ты что именно предлагаешь: погадать, как устроены внутри обе указанные тобой функции и понять, что у тебя написано неверно? ОК. Ставлю 100 против 1, что ошибка где-то между 1 и последней строками твоего кода, считая от начала функции my_array_diff_uassoc() wink.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Invis1ble
Цитата
Ты что именно предлагаешь: погадать, как устроены внутри обе указанные тобой функции и понять, что у тебя написано неверно?

я еще дополню, что assoc подразумевает ассоциативный массив и разница вычисляется по ключам, а у тебя обычные списки.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

qwer123
Суть не в исходнике, я его специально не вылаживал, тк хочу понять логику этой ф-и!

$q = function (){};
$array1 = array('a'=>1,'b'=>2,'c'=>3,'d'=>4);
$array2 = array('a'=>1,'b'=>2,'c'=>3);
$result = array_diff_uassoc($array1, $array2, $q);

Можете проверить так, ничего не поменяется

Array
(
[a] => 1
[b] => 2
[d] => 4
)

У меня сравнение происходит так,

if ($arrays[count($arrays) - 1]($keyArray[$j],$key) === 0 and (string)$arrays[$i][$key] === (string)$value)

уверен, что скорее всего неправильно сравниваю, но как эта ф-я сравнивает, что у нее получается такой результат, я не могу понять!
Игорь_Vasinsky
=== - сравнение типов
== - сравнение значений.

в сам смысл кода не вникал.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
paul85
Цитата (Игорь_Vasinsky @ 23.05.2014 - 06:39)
=== - сравнение типов

Сравнение значений И типов.
qwer123
Я наверное неправильно сформулировал вопрос! Сформулирую конкретней!

помогите понять, как так получается?

$q = function (){};
$array1 = array(1,2,3,4);
$array2 = array(1,2,3);

print_r(array_diff_uassoc($array1, $array2, $q));

выдаёт

Array
(
[0] => 1
[1] => 2
[3] => 4
)

а на мой взгляд, по логике вещей должна выдавать такое
Array
(
[3] => 4
)

как так получается?
sergeiss
Цитата (qwer123 @ 23.05.2014 - 11:12)
как так получается?

Кроме массивов, тут еще участвует твоя кол-бэк функция. Значит, она некорректный результат дает. Скорее всего, прямо противоположный smile.gif Но функция у тебя сугубо секретная, ты не хочешь показать ее полный код, чтобы его можно было оценить... А "экстрасенсов нету".

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
qwer123
Цитата
Кроме массивов, тут еще участвует твоя кол-бэк функция. Значит, она некорректный результат дает. Скорее всего, прямо противоположный smile.gif Но функция у тебя сугубо секретная, ты не хочешь показать ее полный код, чтобы его можно было оценить... А "экстрасенсов нету".


Ребят,ну дело не в моей ф-и,я хочу понять как сравнивает оригинал, что у него получаются такие результаты!

знаю, что в калбек ф-и идут только ключи!

$q = function (){var_dump(func_get_args());};
$array1 = array('a'=>1,'b'=>2,'c'=>3,'d'=>4);
$array2 = array('a'=>1,'b'=>2,'c'=>3);
$result = array_diff_uassoc($array1, $array2, $q);

если запустите данный пример, то вы сами убедитесь!

function key_compare_func2($a, $b)
{var_dump($a.' === '.$b);
if ($a === $b) {
echo 0;
return 0;
} elseif($a > $b) {
echo 1;
return 1;
} else {
echo -1;
return -1;
}
}
$array1 = array('a'=>1,'b'=>2,'c'=>3,'d'=>4);
$array2 = array('a'=>1,'b'=>2,'c'=>3);
$result = array_diff_uassoc($array1, $array2, $q);


если запустите этот пример, то вы убедитесь, что все значения которые опускает эта ф-я возвращает ноль!
sergeiss
Цитата (qwer123 @ 23.05.2014 - 12:23)
function key_compare_func2($a, $b)

Так ГДЕ и КАК ты используешь эту функцию? Вообще, имя этой функции должно быть передано 3-м параметром в array_diff_uassoc(). Ты этого НЕ ДЕЛАЕШь. Так какое отношение имеет указанная функция к твоему примеру?

Цитата (qwer123 @ 23.05.2014 - 12:23)
Ребят,ну дело не в моей ф-и,я хочу понять как сравнивает оригинал, что у него получаются такие результаты!

Еще раз: "оригинал" использует твою кол-бэк функцию, которую ты указал наконец-то. Но не показал, где и как ты ее используешь.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
qwer123
Цитата
Так ГДЕ и КАК ты используешь эту функцию? Вообще, имя этой функции должно быть передано 3-м параметром в array_diff_uassoc(). Ты этого НЕ ДЕЛАЕШь. Так какое отношение имеет указанная функция к твоему примеру?

Цитата (qwer123 @ 23.05.2014 - 12:23)
Ребят,ну дело не в моей ф-и,я хочу понять как сравнивает оригинал, что у него получаются такие результаты!

Еще раз: "оригинал" использует твою кол-бэк функцию, которую ты указал наконец-то. Но не показал, где и как ты ее используешь.


Я пишу аналог этой ф-и(таким способом пытаюсь поднять уровень кодинга), по стандартным примерам, у меня нормально работает, все четко, но если калбек ф-ю поставить такую

$q = function (){};

то у меня расходятся результаты с оригиналом, а следовательно, получается моя ф-я не правильно работает, чтобы ее исправить мне надо понять логику сравнения array_diff_uassoc

Я просто понять не могу, почему такие результаты??? где логика??? Как так сравнение надо вести??

$q = function (){};
$array1 = array(1,2,3,4);
$array2 = array(1,2,3);
print_r(array_diff_uassoc($array1, $array2, $q));


Array
(
[0] => 1
[1] => 2
[3] => 4
)

Это единственный мой вопрос, как так получается?? как она сравнивает, что получаются такие результаты?
sergeiss
3-й параметр в функции array_diff_uassoc() - это пользовательская кол-бэк функция, сравнивающая 2 значения. ГДЕ, блин, это сравнение у тебя делается??? Вот здесь, что ли?
Цитата (qwer123 @ 23.05.2014 - 13:05)
$q = function (){};


Я вот читаю и не понимаю - это "тонкий троллинг" с твоей стороны или нежелание попытаться понять написанное как в хэлпе, так и мной?

Вот "твой" же код, в слегка доработанном виде. Хотя я уже сильно сомневаюсь, что это твой код. Похоже, что ты его где-то нашел, но не понимаешь, что он вообще делает.

$array1 = array(1,2,3,4);
$array2 = array(1,2,3);
echo '<pre>'.print_r(array_diff_uassoc($array1, $array2, 'key_compare_func2'), 1).'</pre>';

function key_compare_func2($a, $b)
{//var_dump($a.' === '.$b);
if ($a === $b) {
// echo 0;
return 0;
} elseif($a > $b) {
// echo 1;
return 1;
} else {
//echo -1;
return -1;
}
}


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
qwer123
Цитата
3-й параметр в функции array_diff_uassoc() - это пользовательская кол-бэк функция, сравнивающая 2 значения. ГДЕ, блин, это сравнение у тебя делается??? Вот здесь, что ли?
Цитата (qwer123 @ 23.05.2014 - 13:05)
$q = function (){};


Я вот читаю и не понимаю - это "тонкий троллинг" с твоей стороны или нежелание попытаться понять написанное как в хэлпе, так и мной?

Вот "твой" же код, в слегка доработанном виде. Хотя я уже сильно сомневаюсь, что это твой код. Похоже, что ты его где-то нашел, но не понимаешь, что он вообще делает.

$array1 = array(1,2,3,4);
$array2 = array(1,2,3);
echo '<pre>'.print_r(array_diff_uassoc($array1, $array2, 'key_compare_func2'), 1).'</pre>';

function key_compare_func2($a, $b)
{//var_dump($a.' === '.$b);
if ($a === $b) {
// echo 0;
  return 0;
} elseif($a > $b) {
// echo 1;
  return 1;
} else {
  //echo -1;
  return -1;
}
}


Это пример из мана php.net! Не пойму при чем тут тролинг, если мне важно понять, почему, при ситуации

$q = function (){};
$array1 = array(1,2,3,4);
$array2 = array(1,2,3);

print_r(array_diff_uassoc($array1, $array2, $q));

такие результаты????

Array
(
[0] => 1
[1] => 2
[3] => 4
)

если, эта ф-я

Цитата
array_diff_uassoc — Вычисляет расхождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции


Источник http://www.php.net/manual/ru/function.array-diff-uassoc.php


Я просто не могу уловить логику сравнения, это для меня важно, как оно так сравнивает, что при нормальной калбек ф-и нормальные результаты, а при пустой, такие результаты???
sergeiss
Цитата (qwer123 @ 23.05.2014 - 13:59)
Это пример из мана php.net! Не пойму при чем тут тролинг, если мне важно понять, почему, при ситуации

$q = function (){};

Пример из мана php.net, говоришь? И где ты там видишь эту переменную $q? rolleyes.gif Может я слепой? laugh.gif Или браузер глупый, не может сделать поиск по $q?

PS.
...взял попкорн, устроился удобнее у экрана. Больше в этой теме у меня нет желания отвечать. Потому что ТС либо не хочет понимать то, что ему говорят (и что написано в мануалах), либо просто откровенно троллит.
Понаблюдаю "в-пол-глаза" за развитием событий в теме....

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
qwer123
Цитата
Пример из мана php.net, говоришь? И где ты там видишь эту переменную $q? rolleyes.gif Может я слепой? laugh.gif Или браузер глупый, не может сделать поиск по $q?


Это я уже сам смоделировал ситуацию!
Быстрый ответ:

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