Как перебрать и вывести многомерный массив на php?
Помогите перебрать и вывести массив на PHP
Имеется массив:
Array
(
[id] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[title] => Array
(
[0] => Первый
[1] => Впервые мы смогли
[2] => Перваши
)
[date] => Array
(
[0] => 2020-11-05 12:51:02
[1] => 2020-11-05 15:26:09
[2] => 2020-11-03 15:27:26
)
[rating] => Array
(
[0] => 1000
[1] => 1212
[2] => 111111
)
[size] => Array
(
[0] => 1000 MB
[1] => 441 GB
[2] => 132 mb
)
[views] => Array
(
[0] => 56252
[1] => 1111
[2] => 1231
)
)
Нужно, чтобы строчка из массива формировалась по номеру в массиве.
Пытаюсь вывести в строчку, чтобы получилось так:
Строка первая - id = 1 | title = Первый | date = 2020-11-05 12:51:02 | rating = 1000
Строка вторая - id = 1 | title = Первый | date = 2020-11-05 12:51:02 | rating = 1212
......
N неизвестно, сколько будет строк в массиве.
Понял, что нужно через фореч выводить, но выводится по порядку, а нужно как в примере.
Ответы (4 шт):
Наверное как то так
$data_raw = ['id' => [1, 2, 3],
'title' => ['Первый','Впервые мы смогли','Перваши'],
'date' => ['2020-11-05 12:51:02','2020-11-05 15:26:09','2020-11-03 15:27:26'],
'rating' => [1000, 1212, 111111], 'size' => ['1000 MB','441 GB','132 mb'],
'views' => [56252, 1111, 1231]];
$data = [];
foreach($data_raw AS $first_key => $array) {
foreach($array AS $key => $value)
$data[$key][$first_key] = $value;
}
var_export($data);
// результат
array ( 0 => array ( 'id' => 1, 'title' => 'Первый', 'date' => '2020-11-05 12:51:02', 'rating' => 1000, 'size' => '1000 MB', 'views' => 56252, ), 1 => array ( 'id' => 2, 'title' => 'Впервые мы смогли', 'date' => '2020-11-05 15:26:09', 'rating' => 1212, 'size' => '441 GB', 'views' => 1111, ), 2 => array ( 'id' => 3, 'title' => 'Перваши', 'date' => '2020-11-03 15:27:26', 'rating' => 111111, 'size' => '132 mb', 'views' => 1231, ), )
$arrs=array(
"id" => array(
"0" => "1",
"1" => "2",
"2" => "3"
),
"title" => array(
"0" => "Первый",
"1" => "Впервые мы смогли",
"2" => "Перваши"
),
"date" => array
(
"0" => "2020-11-05 12:51:02",
"1" => "2020-11-05 15:26:09",
"2" => "2020-11-03 15:27:26"
),
"rating" => array
(
"0" => "1000",
"1" => "1212",
"2" => "111111"
),
"size" => array
(
"0" => "1000 MB",
"1" => "441 GB",
"2" => "132 mb"
),
"views" => array
(
"0" => "56252",
"1" => "1111",
"2" => "1231"
)
);
for ($i=0; $i <3 ; $i++) {
# code...
print_r("ID - ".$arrs["id"][$i]."|Title - ".$arrs["title"][$i]."|date - ".$arrs["date"][$i]."|rating - ".$arrs["rating"][$i]."|size - ".$arrs["size"][$i]."|views - ".$arrs["views"][$i]);
echo "<br>";
}
?>
Итератор с yield, экономнее по памяти, так как собирает необходимые данные на каждой итерации.
function iterate_combined(array $data) {
if (!$data) {
return [];
}
$fields = array_keys($data);
$n = count(reset($data));
for ($i = 0; $i < $n; ++$i) {
$row = [];
foreach ($fields as $field) {
$row[$field] = $data[$field][$i];
}
yield $row;
}
}
$data = [
'id' => [1, 2, 3],
'title' => ['Первый', 'Впервые мы смогли', 'Перваши'],
'date' => ['2020-11-05 12:51:02', '2020-11-05 15:26:09', '2020-11-03 15:27:26'],
'rating' => [1000, 1212, 111111],
'size' => ['1000 MB', '441 GB', '132 mb'],
'views' => [56252, 1111, 1231]
];
foreach (iterate_combined($data) as $row) {
echo json_encode($row, JSON_UNESCAPED_UNICODE), PHP_EOL;
}
{"id":1,"title":"Первый","date":"2020-11-05 12:51:02","rating":1000,"size":"1000 MB","views":56252} {"id":2,"title":"Впервые мы смогли","date":"2020-11-05 15:26:09","rating":1212,"size":"441 GB","views":1111} {"id":3,"title":"Перваши","date":"2020-11-03 15:27:26","rating":111111,"size":"132 mb","views":1231}
array_map+array_combine, создаёт полную копию в памяти ещё до использования, зато oneliner.
$data = [
'id' => [1, 2, 3],
'title' => ['Первый', 'Впервые мы смогли', 'Перваши'],
'date' => ['2020-11-05 12:51:02', '2020-11-05 15:26:09', '2020-11-03 15:27:26'],
'rating' => [1000, 1212, 111111],
'size' => ['1000 MB', '441 GB', '132 mb'],
'views' => [56252, 1111, 1231]
];
$rows = array_map(
fn(...$vals) => array_combine(array_keys($data), $vals),
...array_values($data));
foreach ($rows as $row) {
echo json_encode($row, JSON_UNESCAPED_UNICODE), PHP_EOL;
}