如何根据唯一列获取CSV值(如果发现唯一列循环其某些列)

时间:2014-09-24 20:48:49

标签: php csv fgetcsv

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

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

1 个答案:

答案 0 :(得分:0)

我仍然不确定你想要什么作为你的最终结果,但我希望这能让你前进:

<?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.
    ),
)

我希望能回答你的问题。