Приветствую! Задача такая: Есть строка, например PHP: $old_string = '1:4|2:3|3:2|4:1'; К ней нужно прибавить другую, например PHP: $add_string = '1:3'; Элементы делятся на Ключ:Значение|Ключ2:Значение2 В итоге должен получиться результат PHP: $new_string = '1:7|2:3|3:2|4:1'; Если в добавляемой строке первый элемент ("ключ") не совпадает с уже имеющимися, например PHP: $add_string = '5:1'; То результат будет таким PHP: $new_string = '1:4|2:3|3:2|4:1|5:1'; Дальше, собственно, сам код. Он большой и страшный, собственно в нём и вопрос — можно ли это всё упростить. PHP: <?php $old_string = '1:4|2:3|3:2|4:1'; echo 'old: '. $old_string .'<br>'; $add_string = '5:1'; echo 'add: '. $add_string .'<br>'; list ($add_key, $add_value) = explode (':', $add_string); $old_array = explode ('|', $old_string); foreach ($old_array as $str) { list ($key, $value) = explode (':', $str); $items[] = $key; $values[$key] = $value; } foreach ($items as $t) { if ($t == $add_key) { $exist = true; $values[$t] = $values[$t] += $add_value; } } if (! isset ($exist)) { # добавляем в конец строки $new_string = $old_string .'|'. $add_key .':'. $add_value; } else { while (list ($a, $b) = each ($values)){ $new_temp[] = $a .':'. $b; } $new_string = implode ('|', $new_temp); } echo 'new: '. $new_string;
можно короче раза в 2-3, но станет совсем не читабельно и будет не очевидно, как оно работает. если надо, могу написать на основе preg_match и preg_replace_callback. и еще не ясно, будет ли быстрее. ps: у вас хороший, достаточно быстрый код. зачем его переписывать? определите только $exist = false; в начале, и проверка if($exist) в середине. иначе можно словить наведенную ошибку, если захотите определить $exist где-либо еще выше этого кода
Убрать один лишний массив, один лишний проход, чуток причесать код: PHP: <?php $old_string = '1:4|2:3|3:2|4:1'; echo 'old: '. $old_string .'<br>'; $add_string = '5:1'; echo 'add: '. $add_string .'<br>'; list ($add_key, $add_value) = explode (':', $add_string); $old_array = explode ('|', $old_string); foreach ($old_array as $str) { list ($key, $value) = explode (':', $str); $values[$key] = $value; } if(isset($values[$add_key])){ $values[$add_key]+=$add_value; while (list ($a, $b) = each ($values)) $new_temp[] = $a .':'. $b; $new_string = implode ('|', $new_temp); }else $new_string = $old_string .'|'. $add_string; echo 'new: '. $new_string; ?>
titch Спасибо, хотел понять, можно ли его упростить, но если именно такой и нужен для этой задачи, то я рад, что сам разобрался =) Apple Когда-то давно писал этот код для несостоявшейся вап-игры (предметы в рюкзаке), сейчас понадобился похожий функционал и решил уточнить, можно ли его модифицировать. Shumomer Благодарю!