Внутри элементов массива массивов

Так что это может быть простой вопрос, но я не могу понять это нормально, как бы я получить данные внутри массива массива? Я хочу получить последние два значения через запятую от второго элемента в массиве массива, если это имеет смысл.

Мой массив выглядит так:

 Array
(
[0] => Array
(
[0] => Print Date
[1] => Cost
[2] => Recipient
[3] => Status
[4] => Tracking #/Insurance ID
[5] => Date Delivered
[6] => Carrier
[7] => Class Service
[8] => Special Services
[9] => Insured Value
[10] => Cost Code
[11] => Weight
[12] => Mail Date
[13] => Refund Type
)

[1] => Array
(
[0] => 1/20/2016
[1] => $8.15
[2] => Justin De Los Polive, PO BOX 2353, BLANCO, TX 78606-1232
[3] => Printed
[4] => ="9405511"[5] =>
[6] => USPS
[7] => Priority Mail (R)
[8] => USPS Tracking
[9] =>
[10] =>
[11] => 1lb 8oz
[12] => 1/20/2016
[13] => E-refund
)

[2] => Array
(
[0] => 1/20/2016
[1] => $8.15
[2] => Kist Benings, PO BOX 126, SPECULATOR, NY 12164-0026
[3] => Printed
[4] => ="9405511899563327"[5] =>
[6] => USPS
[7] => Priority Mail (R)
[8] => USPS Tracking
[9] =>
[10] =>
[11] => 1lb 8oz
[12] => 1/20/2016
[13] => E-refund
)

[3] => Array
(
[0] => 1/20/2016
[1] => $8.92
[2] => billy flyn, PO BOX 696, P.O. BOX 696, WESTCLIFFE, CO 81252-1696
[3] => Printed
[4] => ="94063388113621"[5] =>
[6] => USPS
[7] => Priority Mail (R)
[8] => USPS Tracking
[9] =>
[10] =>
[11] => 1lb 8oz
[12] => 1/20/2016
[13] => E-refund
)

Я хочу иметь возможность получить последние два значения через запятую во втором элементе (то есть штат и город) и поместить их в свой собственный элемент, чтобы он выглядел так:

[2] => Array
(
[0] => 1/20/2016
[1] => $8.15
[2] => Kist Benings, PO BOX 126,
[3] => SPECULATOR
[4] => NY 12164-0026
[5] => Printed
[6] => ="9405511899563327"[8] =>
[9] => USPS
[10] => Priority Mail (R)
[11] => USPS Tracking
[12] =>
[13] =>
[14] => 1lb 8oz
[15] => 1/20/2016
[16] => E-refund
)

Мой код:

<?php

function csv_to_array($filename='', $delimiter=',')
{
if(!file_exists($filename) || !is_readable($filename))
return FALSE;

$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}

echo "<pre>";
print_r(csv_to_array('PrintHistory.csv'));
echo "</pre>";

die();
?>

-1

Решение

Предполагая, что записи являются постоянными:

Возьмите Recipient и взорвать его.
Выходная запись состоит из фрагментов массива.

неуклюжий, но он делает свою работу …

рабочая демо …

Код:

// output in here
$out = array();

// lose first record...
array_shift($data);

foreach ($data as $details) {

$recipient = explode(',', $details[2]);

$outRec = array_merge(
array_slice($details, 0, 2),

array($recipient[0] .', '. $recipient[1]),
array_slice($recipient, 2, 1),
array_slice($recipient, 3, 1),

array_slice($details, 3)
);

$out[] = $outRec;
}
0

Другие решения

Если Recipient Формат довольно последовательный:

foreach(array_column($csv, 2) as $val) {
preg_match('/(\w+), (\w{2}) [\d-]+$/', $val, $matches);
$city  = isset($matches[1]) ? $matches[1] : 'none';
$state = isset($matches[2]) ? $matches[2] : 'none';
}
  • array_column() получает массив всех 2 индексы из внутренних массивов.
  • Цикл этого массива.
  • Regex должен получить город и штат.

Вам может понадобиться сделать $something = array_column() а потом unset($something[0]); перед циклом, чтобы избавиться от массива заголовков.

0