2016-04-22 2 views
0

У меня есть два массива, которые в основном представляют данные таблицы HTML. Я хочу объединить их в одну. Один из массивов, $headers, всегда будет меньшим числом, чем второй массив $data.Объединить два массива с неравными значениями в пару значений ключа

Например:

$headers = array("Name","Phone","E-Mail"); 
$data = array("Bob", "Phone1", "E-Mail1", "Mike", "Phone2", "Email2", "Jim", "Phone3", "E-Mail3"); 

То, что я хочу, чтобы как-то цикл через эти два массива и объединить их в один с парой ключей значение в конечном итоге с этим:

$values[1][Name]  = "Bob"; 
$values[1][Phone]  = "Phone1"; 
$values[1][E-Mail]  = "E-Mail1"; 
$values[2][Name]  = "Mike"; 
$values[2][Phone]  = "Phone2"; 
$values[2][E-Mail]  = "E-Mail2"; 
$values[3][Name]  = "Jim"; 
$values[3][Phone]  = "Phone3"; 
$values[3][E-Mail]  = "E-Mail3"; 

В основном, разделите их на многомерный массив, который сортируется по строке таблицы.

Прямо сейчас, хранение моих данных по-другому не является вариантом. Мой вопрос заключается в том, как извлечь его в этот новый массив.

+0

'array_combine' требует равного количества значений в массиве. Я смотрю на 'array_chunk' сейчас - вернусь к вам по этому поводу ... – KickingLettuce

+0

Индексы действительно начинаются с 1, а не 0? –

+0

@ Don'tPanic no. Опечатка. Я все равно удалил, что не нужно для вопроса. – KickingLettuce

ответ

0

Это, как я ее решил, используя array_chunks только:

$values = array_chunk($data, count($headers)); 

Это почти вызвало то, что я хотел, за исключением того, что ключ был индексом из массива заголовков, а не сам заголовок. Так как я до сих пор я ссылаться на массив заголовков, когда я хотел перебрать, я сделал это так:

Когда я хотел использовать эти значения в массиве, я извлек, как это:

foreach ($values[$key] as $key => $value) 
{ 
     $value; // the data 
     $headers[$key]; // the header (String, not index) 
} 
2

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

foreach ($data as $key => $value) { 
    $values[(int) $key/3][$headers[$key % 3]] = $value; 
} 
2

Вы можете сделать это с помощью комбинации array_chunk, array_map и array_combine:

$headers = array("Name","Phone","E-Mail"); 
$data = array("Bob", "Phone1", "E-Mail1", "Mike", "Phone2", "Email2", "Jim", "Phone3", "E-Mail3"); 

$result = array_map(function ($chunk) use ($headers) { 
    return array_combine($headers, $chunk); 
}, array_chunk($data, count($headers))); 

Результат:

Array 
( 
    [0] => Array 
     ( 
      [Name] => Bob 
      [Phone] => Phone1 
      [E-Mail] => E-Mail1 
     ) 

    [1] => Array 
     ( 
      [Name] => Mike 
      [Phone] => Phone2 
      [E-Mail] => Email2 
     ) 

    [2] => Array 
     ( 
      [Name] => Jim 
      [Phone] => Phone3 
      [E-Mail] => E-Mail3 
     ) 

) 
Смежные вопросы