За последние 24 часа нас посетили 15568 программистов и 1603 робота. Сейчас ищут 864 программиста ...

Помогите понять логику array_diff_uassoc

Тема в разделе "Прочие вопросы по PHP", создана пользователем qwer123, 22 май 2014.

  1. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте уважаемые форумчане, очень нуждаюсь в вашей помощи! Я пишу аналог ф-и 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
    )

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

    Очень прошу, помогите разобраться, заранее всем спасибо за помощь!
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а в чем тут разбираться? ваша функция работает неправильно. ищите где. код у вас перед глазами. у нас его нет
     
  3. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    Я наверное неправильно сформулировал вопрос! Сформулирую конкретней!

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

    $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
    )

    как так получается?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я никогда не пользовался, но судя по описанию ты прав. =)
     
  5. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    опишите свою логику вещей. интересно послушать , учитывая что вы передаете калбек функцию которая ничего не возвращает. а должна возвращать целое число.
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    qwer123, мне тоже не понятно, чего ты ожидаешь, если передаёшь пустую пользовательскую функцию сравнения.
     
  7. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    array_diff_uassoc — Вычисляет расхождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции(выдержка из php.net документации)! т е получается,если значение с таким же ключем присутствует в другом(других массивах), то оно исключается!

    А тут получается такое
    $q = function (){};
    $array1 = array(1,2,3,4);
    $array2 = array(1,2,3);

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

    по логике должно выдавать (тк это единственное значение, которого нет во втором массиве)

    Array
    (
    [3] => 4
    )

    а выдает
    Array
    (
    [0] => 1
    [1] => 2
    [3] => 4
    )

    Почему так? почему 1, 2 остались, если они есть во втором массиве, а тройка исключилась?
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    точный ответ нужно смотреть в исходниках функции.

    а вообще, почему вы ждете адекватной работы, если передаете неадекватную callback функцию?
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    qwer123, вот передай функцию, которая сортирует, сразу всё заработает, вернёт Array([3] => 4)
    Код (PHP):
    1. $q = function ($a, $b){
    2.     return ($a>$b)?1:($a<$b)?-1:0;
    3. }; 
    У тебя функция пустая, что равнозначно тому, что она возвращает 0
    Код (Text):
    1. $q = function (){return 0;};
     
  10. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    Вполне адекватная ф-я, тк выборка не меняется, покрутите пример, попробуйте разные массивы по составлять,и вы сами убедитесь, что систематичность присутствует, я только логики не пойму, как так сравнивать,чтобы получить такие ответы???

    Да это я знаю, а как получить такие значения???

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

    как проводить сравнение, чтобы получить такие значения(с тем учетом, что в нормальном режиме, она тоже должна работать)???
     
  11. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Если знаешь, что такие значения получаются, когда функция сравнения возвращает 0, то чего спрашиваешь?
     
  12. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    не пойму логики сравнения, что получаются такие значения!
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    смотри исходники функции. и все станет понятно
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Непонятки возникают оттого, что внутренние механизмы функции пытаются как-то оптимизировать число сравнений. Очевидные варианты callback работают как ожидается, а выяснять почему не работают бессмысленные варианты может только очень неленивый человек. IMHO.
     
  15. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    Качал,ничего не понял, вы не могли бы мне помочь???

    Насчет лени не согласен с вами, мне наоборот кажется, ибо как научиться программировать,если не пытаться делать то, что ты еще не умееешь или не знаешь как работает!
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    я не говорю, что любознательность это плохо. просто учиться лучше на задачах, имеющих практический смысл. тогда твои собственные потребности будут вести тебя как проводник и ты всё запомнишь. у человека память работает на ассоциациях, на связях цель <-> средство.

    ты нашел весьма диковинную функцию. вот скажи, для чего ты хочешь её применить?
     
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    этот вопрос лучше задать в форуме по c++. там больше специалистов, которые в тонкостях смогут раскрыть алгоритм работы и особености реализации этой функции.
     
  18. qwer123

    qwer123 Новичок

    С нами с:
    7 май 2014
    Сообщения:
    8
    Симпатии:
    0
    Я так учусь программировать, и понимать работу яп, возможно вариант не самый лучший, но если задача заставляет долго сидеть и думать, то я считаю,что это хороший метод!

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