2011-11-05 101 views
0

我有這樣的列表在文件中:PHP:建立從列表關聯數組,而無需更換值

paul,1 
peter,1 
mary,1 
ian,1 
paul,2 
peter,2 
mary,2 
paul,3 
mary,3 

我有一個這樣的數組落得:

$people=array(
    'paul'=>array(1,2,3), 
    'peter'=>array(1,2), 
    'mary'=>array(1,2,3), 
    'ian'=>array(1) 
); 

這裏是我是:

$a=file($f);//$a=array, $f=file 
foreach($a as $b){ 
    $l=explode(',',$b);//$l=list 
    $p=$l[0];//$p=person 
    $n=$l[1];//$n=number 
} 
print_r($lista); 

但它當然不工作。有任何想法嗎?

謝謝。

+1

代碼示例中的$ e和$ d是什麼? – Tesserex

+0

只是垃圾,對不起。 – Roger

回答

4

你快到了,但你必須檢查你的變量名。例如。 $d$e沒有在任何地方定義,您將錯誤的參數傳遞給in_array

這應做到:

$file = file($f); 
$list = array(); 

foreach($file as $line){ 
    list($name, $value) = explode(',', $line); 
    if(!isset($list[$name])) { 
     $list[$name] = array(); 
    } 
    $list[$name][] = $value; 
} 

print_r($list); 
+0

爲什麼'isset()'而不是['array_key_exists()'](http://php.net/manual/en/function.array-key-exists.php)? – Tadeck

+0

因爲我想輸入較少;)在這種情況下它是相同的。如果可能的數組值是'null',那麼必須使用'array_key_exists',否則'isset'也是好的。 –

+1

這行代碼有全部答案:'$ list [$ name] [] = $ value;' – Roger

1

沒有要求檢查數組已經存在,或者不是,對於當前的名字。根據下面的語法,PHP將會愉快地爲名稱創建一個數組,如果它不存在的話。

foreach ($a as $b) { 
    list($name, $number) = explode(',', $b); 
    $lista[$name][] = $number; 
} 
+0

語法實際上可以處理它,但人類有時不能。您可以最終獲得數組中先前使用的值,或通過「register_globals」獲取注入數組的項。我建議使用'$ var = array()'來啓動每個數組,以確保安全。 – Frank

+0

我想學習這門語言有時候太過分了。哎呦。 – salathe

+0

這不是要了解語言與否。在某些情況下,這是一個嚴重的安全問題。這至少會被低估,直到有人在你的網站上利用它。 – Frank