За последние 24 часа нас посетили 9326 программистов и 700 роботов. Сейчас ищут 239 программистов ...

Как из одного массива удалить сходные элементы другого

Тема в разделе "PHP для новичков", создана пользователем $oft, 11 окт 2008.

  1. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Объясняю более доступно вопрос:

    Например существует массив:
    $user_numb = array("111111","222222","333333","444444","555555","666666","777777","...и т.д...");

    и еще один массив, состоящий из некоторых элементов 1го массива:
    $del_user_numb = array("222222","555555","666666","..и т.д..");

    Короче на выходе из массива
    $user_numb = array("111111","222222","333333","444444","555555","666666","777777","...и т.д...");
    должен получиться массив
    $user_numb = array("111111","333333","444444","777777","...и т.д...");


    Вопрос: Как из массива $user_numb удалить элементы, которые встречаются в $del_user_numb ?

    Сам я пытался создать скрипт удаления, но удаляет почему-то только 1 элемент, а не все :cry: Вот:
    ________________________
    while (list ($key, $val) = each ($del_user_numb) ):
    $del_user_key = array_keys($user_numb, "$val");
    // ключ удаляемого элемента = ключу элемента из массива -$user_numb, $val = элемент массива $del_user_numb;
    foreach ($del_user_key as $item) {
    unset($user_numb[$item]);
    }
    // удаление элемента из массива $user_numb, ключем которого является ключ, который выявлен при совпадении элемента из $del_user_numb и $user_numb...
    endwhile;

    // комменты к коду не очень понятны, объясню на словах:
    - Происходит цикл: перебор элементов $del_user_numb...
    - затем ищется ключ первого элемента из массива $user_numb, при этом имя этого элемента задается первым элементом массива $del_user_numb... короче ищют ключ в массиве $user_numb, но при этом значение берется из массива $del_user_numb. (должно соблюдаться условие что значения массива $del_user_numb должны присутствовать в массиве
    $user_numb, но по ходу программы массив $del_user_numb будет содержать только значения из массива $user_numb)
    - в итоге мы получили ключ элемента массива $user_numb который надо удалить из $user_numb.
    - удаление элемента массива $user_numb, который имеет ключ $del_user_key. (это происходит через функцию переюора foreach, т.к. ключ удаляемого элемента в следующем цикле меняется.
    - происходит следующий цикл поиска ключа, сравнивания удаления, но уже для следующего элемента.
    но происходит так что при первом цикле удаляется всё как надо, но когда происходит второй, третий, цикл, то удаленные элементы предыдущих циклов возвращаются в массив, и выходит, что удаляется только последний элемент.
    ____________________
    Если ипользовать такое удаление, то удаляется из массива $user_numb только элемент массива $del_user_numb "666666", то есть последний элемент этого массива, а все предыдущие ("222222","555555") остаются нетронутыми.

    Скорее всего я делаю удаление элементов через ж... но я пока новичек. может кто подскажет более адекватный метод или покажет в чем состоит ошибка моего метода.
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    0
    Адрес:
    Минск
  3. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Luge спасибо большое за помощь... но опять проблемма:
    если рассматрривать аррэй_дифф на абстрактном примере, то эта функция просто идеальна, но как только подставляю свои массивы то результат 1 в 1 как и после моего скрипта... в чем проблема не пойму:

    $copy_arr_users # после преобразований # = array("473295721","462353820","415881528","431869210"); // ключи тут не написаны, но они разные;
    $arr_of_stoped_users = array("462353820","415881528","431869210") // тоже ключики/значения не постоянные;
    $del_copy_arr_users = array_diff ($copy_arr_users, $arr_of_stoped_users); // $del_copy_arr_users - массив уже с удаленными юзерами;

    Если ответы вывести в браузер, то вот что пишет:
    Массив $copy_arr_users: //основной массив (из него удаляются элементы)
    Array ( [0] => 473295721 [1] => 462353820 [2] => 415881528 [3] => 431869210 )
    Массив $arr_of_stoped_users: // массив в котором находятся элементы для удаления
    Array ( [0] => 462353820 [1] => 415881528 [2] => 431869210 )
    _________________________________
    Array ( [0] => 473295721 [1] => 462353820 [2] => 415881528 ) // результат после аррей_дифф

    как видно, результат точь в точь как и раньше... :( Может дело в том что все массивы непостоянны и до их образования проходит множество этапов. или дело в ключах, хотя аррей_дифф не реагирует на ключи... Или настройки пхп или деневера надо изменить...
    Luge, если не трудно помоги... :cry:
     
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    0
    Адрес:
    Минск
    во-первых
    во вторых
    PHP:
    1. <?php
    2. $copy_arr_users = array("473295721","462353820","415881528","431869210");
    3. $arr_of_stoped_users = array("462353820","415881528","431869210");
    4. $del_copy_arr_users = array_diff ($copy_arr_users, $arr_of_stoped_users);
    5. echo '$copy_arr_users<pre>'.print_r($copy_arr_users,1).'</pre>
    6. $arr_of_stoped_users<pre>'.print_r($arr_of_stoped_users,1).'</pre>
    7. $del_copy_arr_users<pre>'.print_r($del_copy_arr_users,1).'</pre>';
    8. ?>
    Код (Text):
    1. $copy_arr_users
    2. Array
    3. (
    4.     [0] => 473295721
    5.     [1] => 462353820
    6.     [2] => 415881528
    7.     [3] => 431869210
    8. )
    9. $arr_of_stoped_users
    10. Array
    11. (
    12.     [0] => 462353820
    13.     [1] => 415881528
    14.     [2] => 431869210
    15. )
    16. $del_copy_arr_users
    17. Array
    18. (
    19.     [0] => 473295721
    20. )
    что-то у тебя в коде не так.
     
  5. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Да... что то не так, я даже нашел что, но исправить мне пхп не дает :evil: . Вот фрагмент моего кода:

    $arr_of_stoped_users = file( "stoped_users.txt" );
    $copy_arr_users = array("473295721","462353820","415881528"431869210");
    $del_copy_arr_users = array_diff ($copy_arr_users, $arr_of_stoped_users);


    Так вот массив $arr_of_stoped_users даже не поддается копированию :!: :

    $arr_of_stoped_users = $c; // эта запись выдает ошибку... :x

    Текстовик "stoped_users.txt" содержит текст:
    462353820
    415881528
    431869210

    В чем проблема?
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    0
    Адрес:
    Минск
    в файле в конце каждой строки есть символы новой стпроки. Для винды \r\n, для никсов \n, для маков \r

    прочитанная из файла «462353820\r\n» и содержщаяся во втором массиве «462353820» строки разные.
     
  7. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    :shock: фига се... я думал пхп эт дело сам распознает и сделает как надо. Я вообще не представляю как это дело убрать?? Подскажишш функцию для этого?
     
  8. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    0
    Адрес:
    Минск
  9. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Спасибо, Luge!!! Выручил...)) +1... ща попробую :idea:
     
  10. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    Блин и снова проблема((( Как мог потыркал эту функцию в разные места,.. Не работает. Можешь написать код с исправлением символов форматирования или объяснить каким обазом применить функцию к массиву?
     
  11. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    0
    Адрес:
    Минск
    тупо в лоб
    PHP:
    1. <?php
    2. $copy_arr_users = explode("\r\n",file_get_contents('stoped_users.txt'));
    3. $arr_of_stoped_users = array("462353820","415881528","431869210");
    4. $del_copy_arr_users = array_diff ($copy_arr_users, $arr_of_stoped_users);
    5. echo '$copy_arr_users<pre>'.print_r($copy_arr_users,1).'</pre>
    6. $arr_of_stoped_users<pre>'.print_r($arr_of_stoped_users,1).'</pre>
    7. $del_copy_arr_users<pre>'.print_r($del_copy_arr_users,1).'</pre>';
    8. ?>
     
  12. $oft

    $oft Активный пользователь

    С нами с:
    11 окт 2008
    Сообщения:
    113
    Симпатии:
    0
    Адрес:
    Орел
    :D ну ты выручил!!! Огромное спасибо... ПХП сила))) есть конеш еще множество вопросов, но я лучше сам... :idea: не буду отвлекать)))