У меня есть файл CSV, у которого есть данные строка за строкой. SSCNERIO — это то, что 2 моих столбца всегда имеют одинаковые значения.
Предположим, что если в строке 1 столбец 0 и столбец 1 имеют одно и то же значение, он просто сохраняет их сначала в массиве вместе с другими значениями, которые я хочу зациклить.
На следующей итерации он проверяет, существуют ли значения столбца 0 и столбца 1 в предыдущем массиве, поэтому цикл 1-й столбец и данные этого столбца в новый массив до предыдущих столбцов 0 и столбца 1 имеют разные значения.
Вот данные файла CSV:
PickTicketNumber OrderNumber LineItemUpc LineItemUnitPrice LineItemQuantity
218837 204127 LR8025BLKMD 58 4
218837 204127 LR8025BLKLG 58 3
218837 204127 LR8475HEASM 54 1
218837 204127 LR8770ROYLG 53 1
218838 204128 LR8475HEAXS 54 1
218838 204128 LR8475HEASM 54 2
218838 204128 LR8475HEAMD 54 2
218838 204128 LR8475HEALG 54 1
218838 204128 LR8917BLKXS 58 1
218838 204128 LR8917BLKSM 58 1
218838 204128 LR8917BLKMD 58 1
218838 204128 LR8917BLKLG 58 1
218838 204128 LR6382BLKXS 48 1
218838 204128 LR6382BLKSM 48 2
218838 204128 LR6382BLKMD 48 2
218838 204128 LR6382BLKLG 48 1
218838 204128 LR8475BLKSM 54 2
218838 204128 LR8475BLKMD 54 2
218838 204128 LR8475BLKLG 54 1
218839 204130 LR8878HEAXL 63 1
Как ясно здесь, 218837 204127 существует 4 раза, поэтому я просто хочу его один раз и зациклить его LineItemUpc LineItemUnitPrice LineItemQuantity.
В конечном результате я бы хотел увидеть результат следующим образом:
218837 204127
только один раз, и если он снова существует в следующей строке, то снова зациклите его LineItemUpc LineItemUnitPrice LineItemQuantity. Значит в цикле хочу:
LR8025BLKMD 58 4
LR8025BLKLG 58 3
LR8475HEASM 54 1
LR8770ROYLG 53 1
То же самое и для остальных элементов.
Означает один PickTicketNumber OrderNumber и зацикливает все их значения в следующих строках, имеющих одинаковый PickTicketNumber OrderNumber до тех пор, пока новый PickTicketNumber OrderNumber не появится с новым PickTicketNumber OrderNumber.
В итоге мой окончательный результат будет:
<reference>218837 / 204127</reference>
<line>LR8025BLKMD</line>
<price>58<price>
<qty>3<qty>
<line>LR8025BLKLG</line>
<price>58<price>
<qty>1<qty>
<line>LR8475HEASM</line>
<price>54<price>
<qty>1<qty>
<line>LR8770ROYLG</line>
<price>53<price>
<qty>1<qty>
Я до сих пор не уверен, что вы хотите, чтобы ваш конечный результат, но я надеюсь, что это поможет вам:
<?php
$result = array();
if (($handle = fopen("test.csv", "r")) !== FALSE) {
$row = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// Create a unique key based on the first two fields
$unique = $data[0] . '-' . $data[1];
// Test if this key already exists in the array. If not, create it.
if (!array_key_exists($unique, $result)) {
$result[$unique] = array(
'PickTicketNumber' => $data[0],
'OrderNumber' => $data[1],
'Data' => array(),
);
}
// Append the actual data (all columns except the first two)
$result[$unique]['Data'][] = array_slice($data, 2);
}
fclose($handle);
}
echo "<pre>".print_r($result,1)."</pre>";
Это должно дать что-то вроде:
Array(
'218837-204127' => Array(
'PickTicketNumber' => 218837,
'OrderNumber' => 204127,
'Data' => Array(
array('LR8...MD',58,4),
array('LR80..LG',58,3),
etc.
)
),
'218838-204128' => Array(
etc.
),
)
Я надеюсь, что это отвечает на ваш вопрос.
Других решений пока нет …