2012-11-28 39 views
0

我覺得我做了一些非常愚蠢的事情,但我無法弄清楚它是什麼。
我正在運行由fgetcsv()生成的陣列數組。我想要的是在一行中的值與下一行中的值不同的地方將數組分成兩部分。
此代碼的結果是$first只包含一個數組,而$second包含最後一個 - 完全忽略字符串比較。 strcmp()的結果是一樣的。PHP中兩個字符串的比較,array_slice

$csv = array(); 
$file = fopen('A.csv', 'r'); 
while (($result = fgetcsv($file)) !== false) 
{ 
    $csv[] = $result; 
} 
fclose($file); 

array_shift($csv); //gets rid of the CSV headers 
$rows = count($csv); 

for ($i = 0; $i <= $rows; $i++){ 
    if ($csv[$i][1] != $csv[$i+1][1]){ 
     $first = array_slice($csv, 0, $i); 
     $second = array_slice($csv, $i); 
    } 
} 

下面是CSV文件的一個例子:

NAME,MATCHNAME,CHROMOSOME,START LOCATION,END LOCATION,CENTIMORGANS,MATCHING SNPS 
A,person_one,2,20945970,23287731,2.48,500 
A,person_one,2,233444593,234432885,1.56,500 
A,person_one,4,99184637,100861136,1.24,500 
A,person_two,1,154990798,157871980,2.8,700 //Here's where the new array should start 
A,person_two,1,67136078,70785393,2.28,800 

編輯:我預計$first這個例子是:

Array 
(
[0] => Array 
    (
     [0] => A 
     [1] => person_one 
     [2] => 2 
     [3] => 20945970 
     [4] => 23287731 
     [5] => 2.48 
     [6] => 500 
    ) 

[1] => Array 
    (
     [0] => A 
     [1] => person_one 
     [2] => 2 
     [3] => 233444593 
     [4] => 234432885 
     [5] => 1.56 
     [6] => 500 
    ) 

[2] => Array 
    (
     [0] => A 
     [1] => person_one 
     [2] => 4 
     [3] => 99184637 
     [4] => 100861136 
     [5] => 1.24 
     [6] => 500 
    ) 
) 

我的預期$second是:

Array 
(
[0] => Array 
    (
     [0] => A 
     [1] => person_two 
     [2] => 1 
     [3] => 154990798 
     [4] => 157871980 
     [5] => 2.8 
     [6] => 700 
    ) 

[1] => Array 
    (
     [0] => A 
     [1] => person_two 
     [2] => 1 
     [3] => 67136078 
     [4] => 70785393 
     [5] => 2.28 
     [6] => 800 
    ) 
) 
+1

原諒我,但我不太明白你的問題。你期望的'$ first'和'$ second'是什麼? – Passerby

+0

我用預期值編輯了我的問題。 – lowercasename

回答

1

它正在做你想做的事情,但是當它到達最後一次迭代時,它會將最後一行中的任何內容與null進行比較,因此它會覆蓋$first$second

嘗試在分配後添加break;以滿足條件時跳出循環。

+0

輝煌,謝謝! – lowercasename