Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何基于唯一列获取CSV值(如果找到唯一列,则循环其某些列)_Php_Csv_Fgetcsv - Fatal编程技术网

Php 如何基于唯一列获取CSV值(如果找到唯一列,则循环其某些列)

Php 如何基于唯一列获取CSV值(如果找到唯一列,则循环其某些列),php,csv,fgetcsv,Php,Csv,Fgetcsv,我有一个CSV文件,其中包含逐行数据。场景是我的两列始终具有相同的值 假设,如果在第1行中,第0列和第1列具有相同的值,它将首先将其与我要循环的其他值存储在数组中 在下一次迭代中,它检查前一个数组中是否已经存在列0和列1的值,以便将第1列和该列数据循环到新数组中,直到前一行的列0和列1具有不同的值为止 以下是CSV文件数据: PickTicketNumber OrderNumber LineItemUpc LineItemUnitPrice LineItemQuantity

我有一个CSV文件,其中包含逐行数据。场景是我的两列始终具有相同的值

假设,如果在第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>";

我希望这能回答你的问题。

你试过什么吗?不清楚最终结果会是什么。它会是一个多维数组吗?你能把数组贴在这里吗?@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.
    ),
)