Php 如何基于唯一列获取CSV值(如果找到唯一列,则循环其某些列)
我有一个CSV文件,其中包含逐行数据。场景是我的两列始终具有相同的值 假设,如果在第1行中,第0列和第1列具有相同的值,它将首先将其与我要循环的其他值存储在数组中 在下一次迭代中,它检查前一个数组中是否已经存在列0和列1的值,以便将第1列和该列数据循环到新数组中,直到前一行的列0和列1具有不同的值为止 以下是CSV文件数据:Php 如何基于唯一列获取CSV值(如果找到唯一列,则循环其某些列),php,csv,fgetcsv,Php,Csv,Fgetcsv,我有一个CSV文件,其中包含逐行数据。场景是我的两列始终具有相同的值 假设,如果在第1行中,第0列和第1列具有相同的值,它将首先将其与我要循环的其他值存储在数组中 在下一次迭代中,它检查前一个数组中是否已经存在列0和列1的值,以便将第1列和该列数据循环到新数组中,直到前一行的列0和列1具有不同的值为止 以下是CSV文件数据: PickTicketNumber OrderNumber LineItemUpc LineItemUnitPrice LineItemQuantity
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>";
我希望这能回答你的问题。你试过什么吗?不清楚最终结果会是什么。它会是一个多维数组吗?你能把数组贴在这里吗?@vlzvl是的,我先试过了,所以我把我的逻辑放在这里。我用的是数组,但一点运气都没有。你已经有代码了吗?请把它也贴在这里。我已经贴出了我的最终结果。非常感谢,有一个问题。它没有输出第一条记录:LR8025BLKMD584表示它跳过了第一条结果。它只打印3条,而应该打印4条。这是因为我假设第一条记录是columnnames。您必须删除第一行。我将编辑我的后处理。你给我留下了深刻的印象。非常感谢你。我需要这样的结果。我希望给你10+票支持你是怎么把代码写得这么好的?我想成为一名优秀的程序员,但我还没有做到。
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.
),
)