За последние 24 часа нас посетили 19050 программистов и 1613 роботов. Сейчас ищут 637 программистов ...

Подскажите как удалить дубли в строке?

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

  1. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    Подскажите как удалить дубли (повторяющиеся числа) в строке?

    12, 14, 15, 16, 13, 13, 12, 14, 15,
     
  2. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    explode
    array_unique
    implode
     
  3. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    У меня почемуто так нехочет работать :(
    HTML:
    1.  
    2.  
    3. $all = "12, 14, 15, 16, 13, 13, 12, 14, 15,";  
    4. $massiv = explode(", ", $all); // из строки делаем массив
    5. $massiv = array_unique($massiv); //удаляем дубляжи
    6. $sub = implode(", ", $massiv); //возвращаем в строку
    7.  
    8.  
    В итоге не удаляет числа одинаковые, может где в коде ошибка :(
     
  4. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Ambrella, все удаляется, только 15 не будет удаляться, так как вначале стоит "15", а потом "15,". Убирай запятую на конце строки. substr функция.
     
  5. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    Вот что задаю "12, 14, 15, 16, 13, 13, 12, 14, 15" и на выходе получаю "12, 13, 12, 14, 15, 16"
    Два числа одинаковые выскочили 12...

    Может как то альтернативно можно?
     
  6. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Странно,
    PHP:
    1. <pre>
    2. <?php
    3.  $all = "12, 14, 15, 16, 13, 13, 12, 14, 15,";
    4.  $all = substr($all, 0, -1);
    5.  $massiv = explode(", ", $all);
    6.  $massiv = array_unique($massiv);
    7.  $sub = implode(", ", $massiv);
    8.  print_r($massiv);
    9. ?>
    вывод:
    Код (Text):
    1. Array
    2. (
    3.     [0] => 12
    4.     [1] => 14
    5.     [2] => 15
    6.     [3] => 16
    7.     [4] => 13
    8. )
     
  7. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    Незнаю что происходит — задаю число "12, 12, 14, 15, 16, 13, 13, 12, 14, 15, "
    и получаю Array ( [0] => 12 [1] => 12 [2] => 14 [3] => 15 [4] => 16 [5] => 13 [10] => )
    тоесть (12, 12, 14, 15, 16, 13,)
     
  8. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Ambrella
    ты делишь по ", ", что и есть последние символы в твоем примере.
     
  9. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    У меня не срабатывает
    ни с "12, 12, 14, 15, 16, 13, 13, 12, 14, 15, " — где последний ", "
    ни с "12, 12, 14, 15, 16, 13, 13, 12, 14, 15" — где последний число

    В любом случае дубляжи
     
  10. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    Выкрутился, все сортируется!
    Вот так сделал, через три массива...


    [js]$all = explode(", ", $all);
    $process = $all;
    foreach ($all as $index => $val);

    $finn = array(); //Сюда будем добавлять не повторяющиеся значения

    $i=0;
    while ($i <= $index)
    {
    $new = $all[$i];

    $b=0;
    while ($b <= $index)
    {
    if ($new == $process[$b]) //если совпадение то!
    {

    $c=0;
    $yes="";
    while ($c <= $index)
    {
    if ($process[$b] == $finn[$c])
    {$yes = "fool"; }
    $c++;
    }
    if ($yes != "fool" ) {$finn[] = $process[$b];}

    }
    $b++;
    }
    $i++;
    }
    [/js]
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    ЭЭэ??? Три итерации?
    Кстати, на javascript.ru тоже какое-то неоптимальное решение имхо.

    [js]
    var correct = Array (1, 2, 6, 4, 5, 3, 1, 1, 2);
    function array_unique(arr) {
    var tmp_arr = new Array();
    for (i = 0; i < arr.length; i++) {
    if (tmp_arr.indexOf(arr) == "-1") {
    tmp_arr.push(arr);
    }
    }
    return tmp_arr;
    }
    alert(array_unique(correct).join(", "));
    [/js]
    UPD: Блин ты меня сбил тегом javascript... нужно же на php...

    PHP:
    1.  
    2. <?php
    3. $string = "12, 12, 14, 15, 16, 13, 13, 12, 14, 15";
    4. $array = explode(",", $string);
    5. echo '<pre>';
    6. print_r($array);
    7. /*
    8. Array
    9. (
    10.     [0] => 12
    11.     [1] =>  12
    12.     [2] =>  14
    13.     [3] =>  15
    14.     [4] =>  16
    15.     [5] =>  13
    16.     [6] =>  13
    17.     [7] =>  12
    18.     [8] =>  14
    19.     [9] =>  15
    20. )
    21. */
    22. $res = array_unique($array);
    23. print_r($res);
    24. /*
    25. Array
    26. (
    27.     [0] => 12 //довольно странно,такое же поведение и со строками
    28.     [1] =>  12
    29.     [2] =>  14
    30.     [3] =>  15
    31.     [4] =>  16
    32.     [5] =>  13
    33. )
    34. */
    35. print_r($res);
    36. /*
    37. Array
    38. (
    39.     [0] =>  12
    40.     [1] =>  14
    41.     [2] =>  15
    42.     [3] =>  16
    43.     [4] =>  13
    44. )
    45.  
    46. */
    47. ?>
    48.  
     
  12. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    Сорри что ввел в заблуждение, но тут действительно PHP нужен...
    :)

    Kreker
    спасибо что обратили внимание на проблему, ато как будто об стенку,
    функция не срабатывает — а все в один голос утверждают что все четко!

    Притом с разными числами array_unique выдает даблы в разных местах... Если бы проблема была в первой цифре - давно бы уже обрезал...
     
  13. NOmeR1

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

    С нами с:
    11 май 2008
    Сообщения:
    97
    Симпатии:
    0
    Ничего странного, у тебя разделитель - запятая без пробела, поэтому пробел в начале каждого значения кроме первого (потому что первый находится вначале строки) остаётся. Тут надо либо поставить разделитель - запятую с пробелом, либо убрать пробелы в строке)
    Ambrella, если у тебя поле ввода, которое нужно разделить запятыми, то лучше используй preg_split, так как каждый по-разному ставит пробелы.
    Код (Text):
    1. <?php
    2.     $string = '1, 2,3,3,4,1,2,3,4,4   , 5,  6, 3, 8,    9,10';
    3.     $array = implode(', ', array_unique(preg_split('~\s*,\s*~', $string)));
    4.     echo $array;
    5. ?>
    Вывод
    Код (Text):
    1. 1, 2, 3, 4, 5, 6, 8, 9, 10
     
  14. Ambrella

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

    С нами с:
    10 ноя 2007
    Сообщения:
    206
    Симпатии:
    0
    Спасибо!
     
  15. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    имхо, разбить по запятым и удалить пробелы функцией trim() наверное будет быстрее)
     
  16. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Спасибо, понял.



    Тогда итерацию надо.