Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Объединить массивы для вывода
Форумы портала PHP.SU » » Вопросы новичков » Объединить массивы для вывода

Страниц (1): [1]
 

1. pantela - 19 Июля, 2017 - 14:38:08 - перейти к сообщению
Стоит задача из 3 массивов вывести список городов, какие заказы были у них и какое количество выполненных заказов.

Есть массив список городов:
PHP:
скопировать код в буфер обмена
  1. [country_types] => Array(
  2.   [0] => Array(
  3.     [id] => 1
  4.     [title] => Moscow
  5.   )
  6.   [1] => Array(
  7.     [id] => 2
  8.     [title] => Ukraina
  9.   )
  10.   [2] => Array(
  11.     [id] => 3
  12.     [title] => Japan
  13.   )
  14.   [3] => Array(
  15.     [id] => 4
  16.     [title] => China
  17.   )
  18.   [4] => Array(
  19.     [id] => 5
  20.     [title] => Spane
  21.   )
  22. )


Есть массив список заказов для городов:
PHP:
скопировать код в буфер обмена
  1. [orders_country] => Array(
  2.   [0] => Array(
  3.     [country_id] => 1
  4.   )
  5.   [1] => Array(
  6.     [country_id] => 2
  7.   )
  8.   [2] => Array(
  9.     [country_id] => 5
  10.   )
  11. )



Есть массив количество выполненных заказов:
PHP:
скопировать код в буфер обмена
  1. [records_orders] => Array(
  2.   [0] => Array(
  3.     [id] => 1
  4.     [record] => 21
  5.   )
  6.   [1] => Array(
  7.     [id] => 2
  8.     [record] => 19
  9.   )
  10.   [2] => Array(
  11.     [id] => 3
  12.     [record] => 7
  13.   )
  14.   [3] => Array(
  15.     [id] => 4
  16.     [record] => 0
  17.   )
  18.   [4] => Array(
  19.     [id] => 5
  20.     [record] => 11
  21.   )
  22. )



Надо вывести значения виде:
Заказы города, где: "country_types.id" = "orders_country.country_id"
Количество выполненных заказов, где: "records_orders.id" = "country_types.id" это навреное тоже самое что и "records_orders.id" = "orders_country.country_id", т.к. "country_types.id" всегда будет == "records_orders.id"

В итоге должно быть:
Moscow - есть (выполненно 21 заказов)
Ukraina - есть (выполненно 19 заказов)
Japan - не выполненно (но есть 7 заказов)
China - нету (заказов не найденно)
Spane - есть (выполненно 11 заказов)

спс.Ув.
2. pantela - 19 Июля, 2017 - 17:20:48 - перейти к сообщению
Некоторые советую на стороне БД сделать JOIN, понимаю но мне надо именно так как я описал на PHP стороне всё это сделать... Огорчение
3. pantela - 20 Июля, 2017 - 14:10:24 - перейти к сообщению
Объединил всё в один массив. по структуре получаеться

CODE (htmlphp):
скопировать код в буфер обмена
  1. Город{
  2.     Заказы{
  3.         Выполненые{
  4.             ...
  5.         }
  6.     }
  7. }


Теперь вопрос: В итоге у меня получаеться foreach в foreach надо крутить...? на сколько верно...? Однако
4. Мелкий - 20 Июля, 2017 - 14:25:25 - перейти к сообщению
Если на базе джойнить нельзя - значит надо джойнить на приложении.
На выбор алгоритмы джойна двух наборов данных:
nested loops: вложенный цикл
hash join: сначала один набор данных пихаете в массив ключ объединения => значения, потом идёте по второму и isset'ом быстро и очевидно джойните
merge join: сортируете оба набора по критерию объединения, идёте параллельно по обоим массивам в одном цикле и склеиваете.

Джойн records_orders отлично в hash join подходит. Пересобираете массив вида (видимо) country_id => число заказов
foreach страны
isset($hash[ $country_id ]) => есть заказы в городе

Чем различаются выполненные и найденные заказы - по представленным данным не понял. Но всё равно алгоритмы те же самые.
5. MouseZver - 21 Июля, 2017 - 13:18:35 - перейти к сообщению
pantela пишет:
Теперь вопрос: В итоге у меня получаеться foreach в foreach надо крутить...?

найн Подмигивание один фор достаточен
(Добавление)
Мелкий пишет:
Если на базе джойнить нельзя - значит надо джойнить на приложении.

что за чушь Улыбка пхп приложение..... в бд джойнить религия не позволяет ?

LEFT JOIN
6. Мелкий - 21 Июля, 2017 - 13:35:17 - перейти к сообщению
MouseZver пишет:
что за чушь пхп приложение..... в бд джойнить религия не позволяет ?

Как вы думаете, DBA сотни постгресовых машин не умеет джойнить?

И сюрприз - можно иметь php приложение и не иметь этих данных в базе. Например потому, что это результат внешнего api. Или потому что это разные базы и fdw не спасает. Или какое-нибудь тупое mongodb. Возможностей много.

Впрочем да, спрашивать почему именно переджойнить нельзя на субд мне просто не интересно. Будет или осмысленная причина или фейспалм.
7. MouseZver - 21 Июля, 2017 - 18:53:33 - перейти к сообщению
Мелкий пишет:
DBA сотни постгресовых

При чем тут такой вид баз данных, не подскажешь ? Или Мускуля уже не достаточно, для реализации такой нативной задумки ?

Вот вам и фейспалм.
(Добавление)
Мелкий пишет:
можно иметь php приложение и не иметь этих данных в базе.

В какую то степь заехал охотник поохотиться, а оказалось тут пустыня. Мы скрипты пишем, чтобы их в вебе результат смотреть выполнения, а не каким либо левым софтом.

 

Powered by ExBB FM 1.0 RC1