Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

Соединить массивы

#1 alex159

alex159
  • Пользователь
  • 492 сообщений
  • Репутация: 32
0

Отправлено 14 Май 2014 - 19:43

Здравствуйте!
Есть два массива

Array ( [0] => 1 [1] => 1 [2] => 2 ) - тут id элемента 
Array ( [0] => 4 [1] => 2 [2] => 1 ) - тут количество этих элементов 

Нужно как то их соединить причем так что бы значение повторяющихся элементов суммировались.
И получилось так 
 

Array ( [6] => 1 [1] => 2 )

самая главная трудность в том что все элементы могут быть в разном порядке. 

Пример
 

Array ( [0] => 2 [1] => 1 [2] => 2 [3] => 1  ) - тут id элемента 
Array ( [0] => 4 [1] => 2 [2] => 1 [3] => 4 ) - тут количество этих элементов 

В итоге 



Array ( [5] => 2 [6] => 1  )

Каким способом можно решить эту задачу? 
Заранее спасибо 


Могу привести к такому виду 
 

Array ( [5] => 2 [3] => 1 [1] => 2 )

А теперь как суммировать ключи элементов массива  где значения одинаковые? 


 

 

Сообщение отредактировал alex159: 14 Май 2014 - 19:35

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 15 Май 2014 - 09:24

Здравствуйте.

Как-то вы сумбурно объяснили задачу:


что бы значение повторяющихся элементов суммировались


как суммировать ключи элементов массива где значения одинаковые?

Так что нужно суммировать: значения или ключи?

Дважды перечитал и все равно не понял, что и по какому алгоритму нужно сделать. Например, откуда в первом примере взялся в новом массиве ключ 6? Если суммировать повторяющиеся ключи или повторяющиеся значения, то все равно не получим в итоге 6... в исходных массивах по 3 элемента, а в итоговом 2... то же касается и прочих примеров.

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


  • 0


#3 kamchatniyoleg

kamchatniyoleg
  • Пользователь PRO
  • 1 178 сообщений
  • Репутация: 84

Отправлено 15 Май 2014 - 09:44

Прочитал несколько раз - не понял до сих пор что имеете введу . Опишите подробнее и нормальным понятным языком .


  • 0
Сервис электронного информирования клиентов PostTrail.ru
Отслеживание посылок Почты России в автоматическом режиме! Лояльность клиента - прибыль магазина!


#4 alex159

alex159
    Topic Starter
  • Пользователь
  • 492 сообщений
  • Репутация: 32

Отправлено 15 Май 2014 - 11:55

Извините, голова уже не варит.

Array ( [0] => 2 [1] => 1 [2] => 2 [3] => 1 ) - тут id элемента 
Array ( [0] => 4 [1] => 2 [2] => 1 [3] => 4 ) - тут количество этих элементов 

В первом массиве значение каждого элемента это id.
Во втором, значение каждого элемента это количество записей с таким id 

Нужно сделать так что бы значение с нижнего массива перешло в ключ первого массива 
т.е так
 

Array ( [4] => 2 [2] => 1 [1] => 2 [4] => 1 )

После чего суммировать ключи элементов с одинаковым значением.

Array ( [5] => 2 [6] => 1 )

Извините если не правильно объясняю.


Задачу решил как то так

$a=array(5=>2,3=>1,1=>2);// получил такой массив через цикл foreach
 
foreach($a as $k=>$v) {$b[$v]+=$k;}
 
$a=array_flip($b); // на выходи то что хотел получить

  • 0

#5 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 15 Май 2014 - 12:39


Извините, голова уже не варит.
Array ( [0] => 2 [1] => 1 [2] => 2 [3] => 1 ) - тут id элемента
Array ( [0] => 4 [1] => 2 [2] => 1 [3] => 4 ) - тут количество этих элементов

В первом массиве значение каждого элемента это id. Во втором, значение каждого элемента это количество записей с таким id Нужно сделать так что бы значение с нижнего массива перешло в ключ первого массива т.е так

Array ( [4] => 2 [2] => 1 [1] => 2 [4] => 1 )

 

Плохая идея. Смотрите, а что будет, если у нас кол-во статей для ID 1 будет не 2, а 1? Т.е. вот такие 2 массива:

Array ( [0] => 2 [1] => 1 [2] => 2 ) // тут id элемента 
Array ( [0] => 4 [1] => 1 [2] => 1 ) // тут количество этих элементов 

Тогда, следуя алгоритму, мы должны получить такой промежуточный массив:

Array ( [4] => 2 [1] => 1 [1] => 2 )

Т.е. в промежуточном массиве мы получим два одинаковых ключа 1... в результате интерпретатор просто перезапишет предыдущий элемент массива следующим и получим неожиданный результат:

Array ( [4] => 2 [1] => 2 )

Не знаком с деталями вашей задачи, но здравый смысл подсказывает, что она должна решаться правильно составленным запросом, который выберет из БД нужные ID и кол-во записей для них.


  • 0


#6 alex159

alex159
    Topic Starter
  • Пользователь
  • 492 сообщений
  • Репутация: 32

Отправлено 15 Май 2014 - 12:47

matroskin8, есть 2 таблицы(`phone`,`list`) мне нужно с них вытащить город(`town`) и создать общею статистику по этим данным.

К примеру

первая таблица выводит

Киев | Николаев | Севастополь 
  4     |      1         |   5
 

Вторая

Львов |Николаев|

|  2      |    9         |

В итоге должно получиться 
Киев | Николаев | Севастополь|Львов
  4     |      10        |   5                 |  2


  • 0

#7 kamchatniyoleg

kamchatniyoleg
  • Пользователь PRO
  • 1 178 сообщений
  • Репутация: 84

Отправлено 15 Май 2014 - 13:15

посмотрите в сторону left join , а также GROUP BY


  • 1
Сервис электронного информирования клиентов PostTrail.ru
Отслеживание посылок Почты России в автоматическом режиме! Лояльность клиента - прибыль магазина!


#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 15 Май 2014 - 15:00

Без дампа сложно что-то подсказать. Приложите дамп и покажите какой-нибудь простой реальный результат, который нужно вытащить из базы... лучше результат показать в виде картинки.


  • 1


#9 alex159

alex159
    Topic Starter
  • Пользователь
  • 492 сообщений
  • Репутация: 32

Отправлено 15 Май 2014 - 15:16

Вот код которым я пытаюсь вывести 

 $query = mysql_query("
    SELECT `town` 
    FROM `list` 
    UNION SELECT `town`
   FROM `phone`");
 
   
      while($myrow = mysql_fetch_assoc($query)) {
        $towns[] = $myrow['town'];  //Список всех городов
        }
        echo "<pre>";
      print_r($towns);
      echo "</pre>";
     for($i=0;$i < count($towns);$i++) //Считаем количество записей с каждым городом
      {
         $t = $towns[$i];
         $query = mysql_query("
         SELECT (
                 SELECT COUNT( town ) 
                 FROM  `phone` 
                 WHERE  `town` =  '$t'
                ) AS a, 
                 (
                   SELECT COUNT( town ) 
                   FROM  `list` 
                   WHERE town =  '$t'
                ) AS b");
         $row = mysql_fetch_row($query); 
         $count = $row[0] + $row[1]; //Общие количество с двух таблиц
         $town[$count] = $t; // Ставим в ключ количество записей в значение название города
       
     
      }
echo "<pre>";
         print_r($town);
echo "</pre>";

Но не работает корректно.
Выводит 

Array
(
    [0] => Николаев
    [1] => Буковель
    [2] => Киев
    [3] => харьков
)
Array
(
    [5] => Николаев
    [1] => харьков
)
Куда теряются остальные города?
--
-- Структура таблицы `list`
--

CREATE TABLE IF NOT EXISTS `list` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `phone` varchar(24) NOT NULL,
  `town` varchar(50) NOT NULL,
  `auto` varchar(30) NOT NULL,
  `time_o` int(255) NOT NULL,
  `time_open` int(255) NOT NULL,
  `time_end` int(255) NOT NULL,
  `status` varchar(2) NOT NULL,
  `manager` int(6) NOT NULL,
  `comment` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
--
-- Структура таблицы `phone`
--
 
CREATE TABLE IF NOT EXISTS `phone` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `name` varchar(70) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `town` varchar(60) NOT NULL,
  `auto` int(2) NOT NULL,
  `time` int(255) NOT NULL,
  `status` int(2) NOT NULL,
  `manager` int(3) NOT NULL,
  `comment` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

Сообщение отредактировал alex159: 15 Май 2014 - 15:24

  • 0

#10 alex159

alex159
    Topic Starter
  • Пользователь
  • 492 сообщений
  • Репутация: 32

Отправлено 15 Май 2014 - 15:33

понял. Самое интересно что я понимаю свою ошибку уже после того как напишу на форум :) .
Решил проблему так:

$town[$t] = $count;

Всем большое спасибо! 


  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru