【问题标题】:Array manipulation/remodeling数组操作/重构
【发布时间】:2016-03-01 17:12:25
【问题描述】:

我正在使用 fgetcsv 从 csv 读取数据,输出如下:

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 所以.. 请多多包涵。

【问题讨论】:

    标签: php arrays php-5.3 fgetcsv


    【解决方案1】:

    使用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"
      }
    }
    

    【讨论】:

    • 这是什么版本的 PHP ?
    • 我已将其降级为使用 PHP 5.3,它不能将 [] 用于数组。以前,它需要 PHP 5.4。
    • 可爱,伙计!非常简洁!
    【解决方案2】:

    看看这段代码是否对你有帮助。数组可以有任意数量的元素

    // 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
        )
    
    )
    

    【讨论】:

      【解决方案3】:

      有这样的事情吗?

      foreach($firstarray as $value){
        $newarray[$value[0]] = ['code' => $value[1], 'desc' => $value[2]];
      }
      
      print_r($newarray);
      

      但请记住,此代码会覆盖现有 ID,但您可以通过以下方式检查:if(!isset($newarray[$value[0]])){}

      但我必须在这里说实话。我看不到使用该 ID 作为主索引 ID 的性能优势。排序后的数组应该循环更快。这当然很大程度上取决于 csv 的大小。

      【讨论】:

      • 如果主要目标不是遍历数据怎么办?也许他/她正在尝试创建一个查找表。
      猜你喜欢
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2021-07-19
      • 2011-07-23
      • 2018-11-08
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多