2016-03-01 85 views
0

我從csv使用fgetcsv讀取數據和輸出是這樣的:數組操作/重塑

Array(
    [0] => Array 
     (
     [0] => NUMBER 
     [1] => CODE 
     [2] => DESCRIPTION 
    ) 
    [1] => Array 
     (
     [0] => 19 
     [1] => ABC 
     [2] => RANDOM DESC 
    ) 
    [2] => Array 
     (
     [0] => 56 
     [1] => DEF 
     [2] => ANOTHER DESC 
    ) 
) 

但因爲我會明智做一些基於數字搜索,我認爲我的內存會需要一個這樣的陣列來代替:

Array(
    [19] => Array 
     (
      [CODE] = ABC 
      [DESCRIPTION] = RANDOM DESC 
     ) 
    [56] => Array 
     (
      [CODE] = DEF 
      [DESCRIPTION] = ANOTHER DESC 
     ) 
) 

這是最好的方法還是可能有更好的?另外...有沒有一個功能來做到這一點?我不是很喜歡PHP,所以請耐心等待。

回答

2

使用array_reduce可以使這很容易在這樣的線,你

$result = array_reduce(array_slice($data, 1), function($ys, $x) { 
    list($number, $code, $description) = $x; 
    $ys[intval($number)] = array('CODE' => $code, 'DESCRIPTION' => $description); 
    return $ys; 
}, array()); 

var_dump($result); 

輸出

array(2) { 
    [19]=> 
    array(2) { 
    ["CODE"]=> 
    string(3) "ABC" 
    ["DESCRIPTION"]=> 
    string(11) "RANDOM DESC" 
    } 
    [56]=> 
    array(2) { 
    ["CODE"]=> 
    string(3) "DEF" 
    ["DESCRIPTION"]=> 
    string(12) "ANOTHER DESC" 
    } 
} 
+0

爲了什麼版本的PHP是這樣嗎? – Onilol

+0

我已將它降級爲使用不能使用'[]'作爲數組的PHP 5.3。以前,它需要PHP 5.4。 – naomik

+0

可愛,交配!非常簡潔! – Onilol

0

的東西嗎?

但是請記住,這個代碼將覆蓋現有的ID的,但你可以用檢查:if(!isset($newarray[$value[0]])){}

但我要在這裏說實話。我沒有看到使用該ID作爲主索引ID的性能優勢。一個排序的數組應該循環更快。這當然很大程度上取決於您的csv的大小。

+1

如果主要目標是不循環數據會怎麼樣?也許他/她正在試圖創建一個查找表。 – naomik

1

看看這段代碼可以幫助你。數組可以有任意數量的元素

// removes the header (first element in the array) 
$header = array_shift($data_array); 
// iterate the array 
foreach($data_array as $key=>$value){ 
    // check if array 
if(is_array($value)){ 
    $search_number = $value[0]; 
    foreach($value as $k=>$v){ 
     if($k>0){ 
      $new_data_array[$search_number][$header[$k]]=$v; 
     } 
    } 
} 
} 

print_r($new_data_array); 

出把

Array 
(
[19] => Array 
    (
     [CODE] => ABC 
     [DESCRIPTION] => RANDOM DESC 
    ) 

[56] => Array 
    (
     [CODE] => DEF 
     [DESCRIPTION] => ANOTHER DESC 
    ) 

)