Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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
希望从一个CSV文件中获取ID,该文件在php的其他列中具有相同的值_Php_For Loop_While Loop_Fgetcsv - Fatal编程技术网

希望从一个CSV文件中获取ID,该文件在php的其他列中具有相同的值

希望从一个CSV文件中获取ID,该文件在php的其他列中具有相同的值,php,for-loop,while-loop,fgetcsv,Php,For Loop,While Loop,Fgetcsv,我想根据第二列中具有相同数据的值获取CSV文件第一列中的ID。 我的意思是,如果代码在csv中是EF,那么对于其他代码,它的ID值应该是1,2,3,4,5,依此类推。 因此,我在字符串中获取所有代码值,并在数组中分解它。dn试图获取具有匹配代码值的ID,但未成功。请帮忙 CSV文件: 1,EF,Total Amount Invested,1190000,600000,360000,120000, 2,EF,Market Value,2457939,852578,453191,132471,201

我想根据第二列中具有相同数据的值获取CSV文件第一列中的ID。 我的意思是,如果代码在csv中是EF,那么对于其他代码,它的ID值应该是1,2,3,4,5,依此类推。 因此,我在字符串中获取所有代码值,并在数组中分解它。dn试图获取具有匹配代码值的ID,但未成功。请帮忙

CSV文件:

1,EF,Total Amount Invested,1190000,600000,360000,120000,
2,EF,Market Value,2457939,852578,453191,132471,2019/12/31
3,EF,Returns (Annualised),14.01,14.03,15.54,19.8,
4,EF,Benchmark Returns (Annualised),11.48,11.51,11.38,14.05,
5,EF,Additional Benchmark Returns (Annualised),12.23,12.75,13.42,16.28,
6,AF,Total Amount Invested,910000,600000,360000,120000,
7,AF,Market Value,1636525,845919,434171,132677,2019/12/31
8,AF,Returns (Annualised),15.13,13.71,12.56,20.14,
9,AF,Benchmark Returns (Annualised),11.94,11.51,11.38,14.05,
10,AF,Additional Benchmark Returns (Annualised),12.31,10.57,9.2,12.48,
我的代码:

$fileName_sip = '/var/www/html/php/csv/file.csv';

$file_sip = fopen($fileName_sip, "r");
fseek($file_sip, 1, SEEK_CUR);
$sc_str = "EF,CF,TA,TS,BD,EF,ST,IS,TP,AG,MC,DB,CM,IF,CO,AF,O,EA,ES,CG,GO,NE,DE,ML,WF,EH,US,SC,OG,MM,ON,NI,RA,RC,RD";
$sc_arr = explode(',', $sc_str);
//echo "<pre>";print_r($sc_arr);die;
$i=0;
$ids =array();
for ($i=0; $i < count($sc_arr); $i++) { 

    while (($col_sip[] = fgetcsv($file_sip, 10000, ",")) !== FALSE) {

        if ($col_sip[1] == $sc_arr[$i]) {
            $ids[$i] = $col_sip[0];
        }
    }
}
echo "<pre>";print_r($ids);

下面是一个简化版本,它使用in_数组检查正确的代码值,然后使用代码作为键在$ids数组中构建2个子数组

然后它只是一个数据表示的例子,所以只需循环您创建的数组,并以您喜欢的任何格式生成输出

EF - 1,2,3,4,5
AF - 6,7,8,9,10
第一个循环创建$ids数组,如下所示

第二个输出结果,但您可以根据实际需要进行更改


您的while和for循环的方式是错误的,尽管有更简单的方法来实现这一点您需要为CSV中不存在的代码获取一个空数组吗?如果没有,您不需要预先提供一个包含所有可能值的数组,只需使用一个循环对数据进行循环,并将ID放入目标数组的正确条目中。虽然$col_sip[]=fgetcsv是错误的,但每次都会将一个新项附加到$col_sip。这应该在$col_sip=fgetcsv和for循环完全删除时进行,请参见上面的注释。在循环内部,只需执行$ids[$col_sip[1]][]=$col_sip[0]@乔先生,如果你不删除这个问题,我将向你展示你能多么容易地达到你想要的结果
$file_sip = fopen($fileName_sip, "r");
$sc_str = "EF,CF,TA,TS,BD,EF,ST,IS,TP,AG,MC,DB,CM,IF,CO,AF,O,EA,ES,CG,GO,NE,DE,ML,WF,EH,US,SC,OG,MM,ON,NI,RA,RC,RD";
$sc_arr = explode(',', $sc_str);
$ids = [];

while (($row = fgetcsv($file_sip, 10000, ",")) !== FALSE) {
    if (in_array($row[1], $sc_arr)) {
        $ids[$row[1]][] = $row[0];
    }
}
print_r($ids);

// make into a string
foreach ($ids as $key => $id){
    echo $key . ' - ' . implode(',', $id) . PHP_EOL;
}
Array
(
    [EF] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
            [4] => 5
        )

    [AF] => Array
        (
            [0] => 6
            [1] => 7
            [2] => 8
            [3] => 9
            [4] => 10
        )

)
EF - 1,2,3,4,5
AF - 6,7,8,9,10