#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. Отлично! теперь он печатает уникальную запись, но в нескольких строках, и я хочу, чтобы она была в одной строке для каждого пользователя, пожалуйста, проверьте, что я отредактировал свой выходной результат.