За последние 24 часа нас посетили 22875 программистов и 1259 роботов. Сейчас ищут 711 программистов ...

Сложение строк особым образом

Тема в разделе "Решения, алгоритмы", создана пользователем F1do, 23 мар 2011.

  1. F1do

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

    С нами с:
    19 июн 2008
    Сообщения:
    41
    Симпатии:
    0
    Приветствую!
    Задача такая:
    Есть строка, например
    PHP:
    1. $old_string = '1:4|2:3|3:2|4:1';
    К ней нужно прибавить другую, например
    PHP:
    1. $add_string = '1:3';
    Элементы делятся на Ключ:Значение|Ключ2:Значение2
    В итоге должен получиться результат
    PHP:
    1. $new_string = '1:7|2:3|3:2|4:1';
    Если в добавляемой строке первый элемент ("ключ") не совпадает с уже имеющимися, например
    PHP:
    1. $add_string = '5:1';
    То результат будет таким
    PHP:
    1. $new_string = '1:4|2:3|3:2|4:1|5:1';
    Дальше, собственно, сам код. Он большой и страшный, собственно в нём и вопрос — можно ли это всё упростить.


    PHP:
    1. <?php
    2.  
    3. $old_string = '1:4|2:3|3:2|4:1';
    4. echo 'old: '. $old_string .'<br>';
    5. $add_string = '5:1';
    6. echo 'add: '. $add_string .'<br>';
    7. list ($add_key, $add_value) = explode (':', $add_string);
    8. $old_array = explode ('|', $old_string);
    9. foreach ($old_array as $str) {
    10.     list ($key, $value) = explode (':', $str);
    11.     $items[] = $key;
    12.     $values[$key] = $value;
    13. }
    14. foreach ($items as $t) {
    15.     if ($t == $add_key) {
    16.         $exist = true;
    17.         $values[$t] = $values[$t] += $add_value;
    18.     }
    19. }
    20. if (! isset ($exist)) { # добавляем в конец строки
    21.     $new_string = $old_string .'|'. $add_key .':'. $add_value;
    22. } else {
    23.     while (list ($a, $b) = each ($values)){
    24.         $new_temp[] = $a .':'. $b;
    25.     }
    26.     $new_string = implode ('|', $new_temp);
    27. }
    28. echo 'new: '. $new_string;
     
  2. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    можно короче раза в 2-3, но станет совсем не читабельно и будет не очевидно, как оно работает. если надо, могу написать на основе preg_match и preg_replace_callback. и еще не ясно, будет ли быстрее.
    ps: у вас хороший, достаточно быстрый код. зачем его переписывать? определите только $exist = false; в начале, и проверка if($exist) в середине. иначе можно словить наведенную ошибку, если захотите определить $exist где-либо еще выше этого кода
     
  3. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    F1do
    Скажи, пожалуйста, откуда такая задача взялась?
    Мне правда интересно, без сарказма.
     
  4. Shumomer

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

    С нами с:
    12 мар 2011
    Сообщения:
    194
    Симпатии:
    1
    Адрес:
    из вашего вображения
    Убрать один лишний массив, один лишний проход, чуток причесать код:

    PHP:
    1. <?php
    2. $old_string = '1:4|2:3|3:2|4:1';
    3. echo 'old: '. $old_string .'<br>';
    4. $add_string = '5:1';
    5. echo 'add: '. $add_string .'<br>';
    6.  
    7. list ($add_key, $add_value) = explode (':', $add_string);
    8. $old_array = explode ('|', $old_string);
    9. foreach ($old_array as $str) {
    10.    list ($key, $value) = explode (':', $str);
    11.    $values[$key] = $value;
    12. }
    13.  
    14. if(isset($values[$add_key])){
    15.   $values[$add_key]+=$add_value;
    16.   while (list ($a, $b) = each ($values)) $new_temp[] = $a .':'. $b;
    17.   $new_string = implode ('|', $new_temp);
    18. }else $new_string = $old_string .'|'. $add_string;
    19.  
    20. echo 'new: '. $new_string;
    21. ?>
     
  5. F1do

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

    С нами с:
    19 июн 2008
    Сообщения:
    41
    Симпатии:
    0
    titch
    Спасибо, хотел понять, можно ли его упростить, но если именно такой и нужен для этой задачи, то я рад, что сам разобрался =)

    Apple
    Когда-то давно писал этот код для несостоявшейся вап-игры (предметы в рюкзаке), сейчас понадобился похожий функционал и решил уточнить, можно ли его модифицировать.

    Shumomer
    Благодарю!