Добавьте аналогичную запись даты в один td

#php

Вопрос:

У меня есть следующий массив записей, который содержит информацию о пользователе, а также информацию о местоположении:

 $arr =  [  [  'user_id' =gt; 5,  'l_id' =gt; 10,  'Name' =gt; 'John Doe',  'Location' =gt; 'Chicago',  'date' =gt; '2021-10-02'  ],  [  'user_id' =gt; 5,  'l_id' =gt; 11,  'Name' =gt; 'John Doe',  'Location' =gt; 'Houston',  'date' =gt; '2021-10-02'  ],  [  'user_id' =gt; 6,  'l_id' =gt; 12,  'Name' =gt; 'Rob Doe',  'Location' =gt; 'Dallas',  'date' =gt; '2021-10-02'  ],  [  'user_id' =gt; 6,  'l_id' =gt; 13,  'Name' =gt; 'Rob Doe',  'Location' =gt; 'Philadelphia',  'date' =gt; '2021-10-02'  ],   ];  

Я пытаюсь отобразить одну и ту же запись о местоположении пользователя/дня в одном td, используя следующий код:

 $html = ''; foreach ($arr as $ar) {   if ($ar['date'] == $ar['date']) {   $html .= 'lt;trgt;  lt;tdgt;' . $ar['Name'] . 'lt;/tdgt;  lt;tdgt;' . $ar['date'] . 'lt;/tdgt;  lt;tdgt;' . $ar['Location'] . 'lt;/tdgt;  lt;/trgt;';  } }  

HTML:

 lt;tablegt;  lt;theadgt;  lt;trgt;  lt;thgt;Namelt;/thgt;  lt;thgt;Datelt;/thgt;  lt;thgt;Locationlt;/thgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  lt;?= $html; ?gt;  lt;/tbodygt;  lt;/tablegt;  

Но это повторяет одну и ту же запись даты несколько раз (Имя, дата).:

 Name Date Location John Doe 2021-10-02 Chicago John Doe 2021-10-02 Houston Rob Doe 2021-10-02 Dallas Rob Doe 2021-10-02 Philadelphia  

And I want result like this:

 Name Date Location John Doe 2021-10-02 Chicago  Houston -------------------------------------------- Rob Doe 2021-10-02 Dallas  Philadelphia  

Ответ №1:

Use this function for creating your required data:

 function arrayChanger($oldArray) {  $newArray = array();  foreach ($oldArray as $v) {  if (!isset($newArray[$v['user_id']])) {  $newArray[$v['user_id']] = array(  'user_id' =gt; $v['user_id'],  'dataArray' =gt; array()  );  }  $newArray[$v['user_id']]['dataArray'][] = array(  'l_id' =gt; $v['l_id'],  'Name' =gt; $v['Name'],  'Location' =gt; $v['Location'],  'date' =gt; $v['date'],  );  }  return $newArray; }  

И затем вы можете использовать это в своем массиве:

 $html = 'lt;tablegt;  lt;theadgt;  lt;trgt;  lt;thgt;Namelt;/thgt;  lt;thgt;Datelt;/thgt;  lt;thgt;Locationlt;/thgt;  lt;/trgt;  lt;/theadgt; lt;tbodygt;'; foreach (arrayChanger($arr) as $newArrayKey =gt; $newArrayValue) {  if (count($newArrayValue['dataArray']) lt;= 1) {  $html .= 'lt;trgt;  lt;tdgt;' . $value['Name'] . 'lt;/tdgt;  lt;tdgt;' . $value['date'] . 'lt;/tdgt;  lt;tdgt;' . $value['Location'] . 'lt;/tdgt;  lt;/trgt;';  } else {  $i = 0;  foreach ($newArrayValue['dataArray'] as $key =gt; $value) {  $html .= 'lt;trgt;';  ($i === 0) ? $html .= 'lt;tdgt;' . $value['Name'] . 'lt;/tdgt;' : $html .= 'lt;tdgt; lt;/tdgt;';  ($i === 0) ? $html .= 'lt;tdgt;' . $value['date'] . 'lt;/tdgt;' : $html .= 'lt;tdgt; lt;/tdgt;';  $html .= 'lt;tdgt;' . $value['Location'] . 'lt;/tdgt;';  $html .= 'lt;/trgt;';  $i = $i   1;  }  } } $html .= 'lt;/tbodygt; lt;/tablegt;';  

Результат будет таким, как вам нужно:

Имя Дата Расположение
Неизвестный Джон 2021-10-02 Чикаго
Хьюстон
Роб Доу 2021-10-02 Даллас
Филадельфия

Редактировать:

По мере изменения вопроса я изменил свой ответ, чтобы у нас была функция:

 function arrayChanger($oldArray) {  $newArray = array();  foreach ($oldArray as $v) {  if (!isset($newArray[$v['user_id']])) {  $newArray[$v['user_id']] = array(  'user_id' =gt; $v['user_id'],  'l_id' =gt; $v['l_id'],  'Name' =gt; $v['Name'],  'date' =gt; $v['date'],  'UserLocations' =gt; array()  );  }  $newArray[$v['user_id']]['UserLocations'][] = array(  'Location' =gt; $v['Location'],  );  }  return $newArray; }  

И после этого создаем HTML:

 $html = 'lt;tablegt;  lt;theadgt;  lt;trgt;  lt;thgt;Namelt;/thgt;  lt;thgt;Datelt;/thgt;  lt;thgt;Locationlt;/thgt;  lt;/trgt;  lt;/theadgt; lt;tbodygt;'; foreach (arrayChanger($arr) as $newArrayKey =gt; $newArrayValue) {   $html .= 'lt;trgt;  lt;tdgt;' . $newArrayValue['Name'] . 'lt;/tdgt;  lt;tdgt;' . $newArrayValue['date'] . 'lt;/tdgt;  lt;tdgt;';   foreach ($newArrayValue['UserLocations'] as $key =gt; $value) {  $html .= $value['Location'] . "lt;brgt;";  }   $html .= 'lt;/tdgt;  lt;/trgt;'; }  $html .= 'lt;/tbodygt; lt;/tablegt;';  

Результат будет:

Имя Дата Расположение
Неизвестный Джон 2021-10-02 Чикаго
Хьюстон
Роб Доу 2021-10-02 Даллас
Филадельфия

Комментарии:

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

2. @glitchy Отредактировано для ваших нужд

3. Теперь он работает идеально!

Ответ №2:

Вы можете создать новый массив, в котором вы объедините дату и местоположение.

 $newArr = []; foreach($arr as $item) {   if(isset($newArr[$item['Name']])) {  $newArr[$item['Name']]['Location'][] = $item['Location'];  $newArr[$item['Name']]['date'][] = $item['date'];   } else {  $newArr[$item['Name']]['user_id'] = $item['user_id'];  $newArr[$item['Name']]['l_id'] = $item['l_id'];  $newArr[$item['Name']]['Name'] = $item['Name'];  $newArr[$item['Name']]['Location'] = [$item['Location']];  $newArr[$item['Name']]['date'] = [$item['date']];  } }  print_r($newArr);  

результатом будет:

 Array (  [John Doe] =gt; Array  (  [user_id] =gt; 5  [l_id] =gt; 10  [Name] =gt; John Doe  [Location] =gt; Array  (  [0] =gt; Chicago  [1] =gt; Houston  )   [date] =gt; Array  (  [0] =gt; 2021-10-02  [1] =gt; 2021-10-02  )   )   [Rob Doe] =gt; Array  (  [user_id] =gt; 6  [l_id] =gt; 12  [Name] =gt; Rob Doe  [Location] =gt; Array  (  [0] =gt; Dallas  [1] =gt; Philadelphia  )   [date] =gt; Array  (  [0] =gt; 2021-10-02  [1] =gt; 2021-10-02  )   )  )  

Затем вы можете использовать свой цикл. А для даты и местоположения элементов вы можете использовать функцию php implode (implode (‘,’, [])). Это будет самый простой способ.

Комментарии:

1. Ценю ваши советы!

Ответ №3:

Попробуйте этот код, который печатает имя и дату только в первый раз:

 $html = ''; $count=0; foreach ($arr as $ar) {    if ($ar['date'] == $ar['date']) {  if($count == 0){  $html .= 'lt;trgt;  lt;tdgt;' . $ar['Name'] . 'lt;/tdgt;  lt;tdgt;' . $ar['date'] . 'lt;/tdgt;  lt;tdgt;' . $ar['Location'] . 'lt;/tdgt;  lt;/trgt;';  $count  ;  } else{  $html .= 'lt;trgt;  lt;tdgt;lt;/tdgt;  lt;tdgt;lt;/tdgt;  lt;tdgt;' . $ar['Location'] . 'lt;/tdgt;  lt;/trgt;'; $count=0; } } }  

Комментарии:

1. Не работает, все равно тот же результат, что и у меня.

2. я обновил свой ответ, попробуйте agin

3. Отлично! теперь он печатает уникальную запись, но в нескольких строках, и я хочу, чтобы она была в одной строке для каждого пользователя, пожалуйста, проверьте, что я отредактировал свой выходной результат.