За последние 24 часа нас посетил 22801 программист и 1260 роботов. Сейчас ищут 765 программистов ...

Разбить и сложить массив данных

Тема в разделе "PHP для новичков", создана пользователем zhenia3003, 26 сен 2017.

  1. zhenia3003

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

    С нами с:
    20 авг 2012
    Сообщения:
    179
    Симпатии:
    3
    Задачка. Есть строка "1_2,2_5,1_4,6_3", необходимо разбить строку и найти одинаковые значения до нижнего подчеркивания (одинаковые значения 1_2 и 1_4), после этого необходимо сложить числа у одинаковых значений после нижнего подчеркивания (то есть сложить 2 и 4). После сложения мы должны получить из строки "1_2,2_5,1_4,6_3" строку "1_6,2_5,6_3".
    Получилось разбить строку на массив, как теперь сделать сложение?
    PHP:
    1. $top = "1_2,2_5,1_4,6_3";
    2. $id = array();
    3. $num = array();
    4. foreach (explode(",", implode(",", $top)) as $key) {
    5. $key = explode("_", $key);
    6. $id[] = $key[0];
    7. $num[] = $key[1];
    8. }
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    эм... в топ - строка. имплод по запятой - ничего не изменит. эксплод результата имплода соответственно будет таким же как и просто эксплод для исходной строки. зачем там имплод?

    PHP:
    1. $top = "1_2,2_5,1_4,6_3";
    2. $tmp = [];
    3.  
    4. foreach(explode(',', $top) as $mix) // дробим входную строку по запятым. получаем "миксы"
    5. {
    6.     list($bank, $value) = explode('_', $mix); // дробим "микс" по ундерскору. получаем "банк" и "значение"
    7.    
    8.     if (!isset($tmp[$bank])) // если во временном массиве нет "банка"
    9.     {
    10.         $tmp[$bank] = 0; // задаем ему нулевое значение
    11.     }
    12.    
    13.     $tmp[$bank] += $value; // прибавляем текущему значению "банка" значение текущего "микса"
    14. }
    15.  
    16. array_walk($tmp, function(&$value, $bank) { $value = $bank . '_' . $value; }); // собираем пары банк-значение по ундерскору. получаем массив "миксов"
    17. $out = implode(',', $tmp); // собираем "миксы" в строку через запятую
    18.  
    19. // пьём виски. да, утром надо пить благородные напитки
    теперь скажи, @zhenia3003, ты разделом не ошибся ли?
     
  3. zhenia3003

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

    С нами с:
    20 авг 2012
    Сообщения:
    179
    Симпатии:
    3
    Спасибо, работает. Только я закомментил 2 строку ($tmp = [];) иначе Parse error: syntax error, unexpected. В этот раздел написал, чтобы получить оперативный ответ профессионалов :);)
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Естественно ты её закоментил .У тебя пхп версии старше чем говно мамонта. Про то что квадратные скобки существуют уже несколько лет - ты не в курсе, поэтому тебе куда проще спрятать объявление массива и потом получать нотисы за попытку использования необъявленной переменной. Норм чо.

    Ммм... сколько денег задонатишь за моё время?
     
    mkramer нравится это.
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Только вот темы в этом разделе подразумевают более высокую квалификацию вопроса. Перенесено в php для новичков.
    На будущее - разделы нужны для логического разделения форума. Частота просмотра у них одинаковая, потому что люди смотрят вкладку "новые посты", а не шерстят ветки.

    Впредь просьба помещать посты в разделы, которые им подходят на основании содержания постов, а не личных желаний.