Объединить два разных массива данных в один массив php

#php #multidimensional-array

#php #многомерный массив

Вопрос:

Я хочу объединить два разных массива данных в один массив, но я не понимаю, как использовать array_push в этом случае.

это пример моего ввода данных:

 ["author"]=>
  array(2) {
    [0]=>
    string(1) "John"
    [1]=>
    string(1) "Doe"
  }
["title"]=>
  array(2) {
    [0]=>
    string(1) "book a"
    [1]=>
    string(1) "book b"
  }
  

И результат в одном массиве, который я имею в виду, вот так:

 ["books"]=>
      array(2) {
        [0] =>
        array(2) {
          ["author"]=>
          string(1) "John"
          ["title"]=>
          string(1) "book a"
        }
        [1] =>
        array(2) {
          ["author"]=>
          string(1) "Doe"
          ["title"]=>
          string(1) "book b"
        }
      }
  

Я уже пытаюсь использовать этот способ, но он просто возвращает 1 из каждого массива:

 $data['books'] = [];

      array_push($data['books'], [
        'author' => $data['author'],
        'title' => $data['title']
      ]);

if (isset($data['books'])) {
  foreach ($data['books'] as $k => $v) {
    $data['books'][$k]['author'] = (int)$v['author'];
    $data['books'][$k]['title'] = (int)$v['title'];
  }
}

result:

["books"]=>
  array(1) {
    [0]=>
    array(2) {
      ["author"]=>
      int(1)
      ["title"]=>
      int(1)
    }
  }
  

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

1. «запутанный» означает, что именно? Покажите свои усилия и объясните, где вы застряли в коде.

2. Где вы застряли? Что вы пробовали? Что именно вас смущает? array_push($arr, $val); = $arr[] = $val; . Они одинаковы. Оба добавляют элемент в массив.

3. Как вы создаете первый массив? Это то, что вы хотите изменить, чтобы вместо этого получить второй.

Ответ №1:

Вы должны транспонировать свои массивы с учетом ключей.

 function transpose(array $arr){
  $transArr = [];
  foreach($arr as $keyRow => $subArr) {
    foreach($subArr as $keyCol => $value) {
      $transArr[$keyCol][$keyRow] = $value;
    }
  }
  return $transArr;
}
  

Эта функция может использоваться универсально для подобных задач. Функция происходит из этого класса.

Как использовать:

 $input = [
  "author"=> ["John","Doe"],
  "title" => ["book a","book b"],
];

$books = transpose($input);

echo '<pre>';
var_export($books);
  

Или, если вы хотите использовать класс:

 $books = tableArray::create($input)
  ->transpose()
  ->fetchAll()
;
  

Вывод:

 array (
  0 => 
  array (
    'author' => 'John',
    'title' => 'book a',
  ),
  1 => 
  array (
    'author' => 'Doe',
    'title' => 'book b',
  ),
) 
  

Если «author» и «title» существуют как два массива, сначала необходимо создать $ input следующим образом:

 $input = ['author' => $arrayAuthor, 'title' => $arrayTitle];
  

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

1. спасибо, чтобы ответить на мой вопрос:») на самом деле просто нужно создать 1 пустой массив var, а затем поместить его при циклировании каждого массива данных huhuhu