2012-02-16 26 views
0

我查看了所有類似的問題和示例(有很多),但仍無法使其工作(儘管我認爲我很接近) 。如何按子數組對數組進行分組並重新分配PHP中的鍵

我有一個文本文件拉到員工安排的數組...

自定:

 

    123,Joe,20120208,0845,1645 
    123,Joe,20120209,0800,1600 
    456,Sue,20120208,0900,1700 
    456,Sue,20120209,0700,1500 
    ... 

我的代碼來生成數組:

 

    $schedule = file_get_contents('./schedule.txt'); 
    $s = explode("\n", $schedule); 
    for ($i = 0; $i < count($s); $i++) { 
     $s[$i] = explode(",", $s[$i]); 
    } 
    print_r($s); 

輸出是:

 

    Array 
    (
     [0] => Array 
      (
       [0] => 123 
       [1] => Joe 
       [2] => 20120208 
       [3] => 0845 
       [4] => 1645 
      ) 

     [1] => Array 
      (
       [0] => 123 
       [1] => Joe 
       [2] => 20120209 
       [3] => 0800 
       [4] => 1600 
      ) 

     [2] => Array 
      (
       [0] => 456 
       [1] => Sue 
       [2] => 20120208 
       [3] => 0900 
       [4] => 1700 
      ) 

     [3] => Array 
      (
       [0] => 456 
       [1] => Sue 
       [2] => 20120209 
       [3] => 0700 
       [4] => 1500 
      ) 
    ) 

我不是設法集團員工憑身份證在一個新的多維陣列的輸出是這樣的:

 

    Array 
    (
     [123] => Array 
      (
       [0] => Array 
        (
         [0] => Joe 
         [1] => 20120208 
         [2] => 0845 
         [3] => 1645 
        ) 

       [1] => Array 
        (
         [0] => Joe 
         [1] => 20120209 
         [2] => 0800 
         [3] => 1600 
        ) 
      ) 

     [456] => Array 
      (
       [0] => Array 
        (
         [0] => Sue 
         [1] => 20120208 
         [2] => 0900 
         [3] => 1700 
        ) 

       [1] => Array 
        (
         [0] => Sue 
         [1] => 20120209 
         [2] => 0700 
         [3] => 1500 
        ) 
      ) 
    ) 

我不能爲我的生命換我圍繞着如何改變我現有的陣列到這個新頭(不同的)輸出... 我想這一點,但還是一無所獲:

 

    $newArr = array(); 

    foreach($s as $k => $v) { 
     if(!isset($newArr[$v[0]])) { 
      $newArr[$v[0]] = array(); 
     } 

     $newArr[$v[0]][] = array($v[0]); 
    } 

雖然我的輸出現在是:

 

    Array 
    (
     [123] => Array 
      (
       [0] => Array 
        (
         [0] => 123 
        ) 

       [1] => Array 
        (
         [0] => 123 
        ) 
      ) 

     [456] => Array 
      (
       [0] => Array 
        (
         [0] => 456 
        ) 

       [1] => Array 
        (
         [0] => 456 
        ) 
      ) 
    ) 

有什麼想法?我知道我失去了一些東西在我的周圍行代碼:

 

    $newArr[$v[0]][] = array($v[0]); 

我試圖將其更改爲:

 

    $newArr[$v[0]][] = array(0 => $v[1], 1 => $v[2], 2 => $v[3], 3 => $v[4]); 

這給我正確的輸出,但我現在得到了一個未定義的偏移誤差。另外,如果鑰匙在子陣列更改的數量,這個代碼現在僅限於4我明確地進入...

回答

4

這應該是足夠了,如果我理解你的權利:)

$lines = file('./schedule.txt'); 

$employees = array(); 
foreach ($lines as $line) 
{ 
    $chunks = explode(',', $line); 
    $employees[$chunks[0]][] = array_slice($chunks, 1); 
} 

print_r($employees); 
+0

哇,看起來我實際上追求的都是錯的 - 完美無缺。感謝您的快速。 – MonkishTypist 2012-02-16 23:41:32

1
<?php 
//read the file into an array with each line being an entry 
$schedule = file('./schedule.txt'); 
//empty array 
$s = array(); 
//loop through file lines 
foreach($schedule as $row){ 
    //explode on comma 
    $row = explode(",", trim($row)); 
    //if the id doesn't exist yet... 
    if(!isset($s[$row[0]])){ 
     //...make it an empty array 
     $s[$row[0]] = array(); 
    } 
    //add the row under the id 
    $s[$row[0]][] = $row; 
} 
print_r($s); 
?> 
1

您可以使用fscanf

$handle = fopen('./schedule.txt', 'r'); 
$employees = array(); 
while ($line = fscanf($handle, '%d,%s')) { 
    $employees[$line[0]][] = explode(',', $line[1]); 
} 
fclose($handle); 

print_r($employees); 
2

有一個叫fgetcsv輕鬆地抓取逗號分隔值的功能。不需要自己做。

此代碼還可以解決你的問題,妥善處理空行:

if (($handle = fopen("schedules.csv", "r")) !== FALSE) { 

    $schedules = array(); 
    while (($data = fgetcsv($handle)) !== FALSE) { 
     if ($data[0] !== null) { //blank lines return an array containing null 
      $schedules[$data[0]][] = array_slice($data, 1); 
     } 
    } 
    fclose($handle); 

    //do what you need to 

} else { 
    // file failed to open 
} 

注意,我指定的文件.csv而不是.txt。我建議您將以逗號分隔的值保存爲.csv文件。也許甚至可以定義文件中的每一列。