2016-03-01 48 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 
    ) 

)