【问题标题】:Looping through and clearing arrays循环遍历和清除数组
【发布时间】:2014-11-22 17:41:50
【问题描述】:

我在数组中有数组,所有数组都包含不同数量的信息。我的 CSV 表当前包含名称、电子邮件和电话号码字段。 下面是我的数组;

Array
(
[0] => Array
    (
        [0] => Name
        [1] => Email
        [2] => Phone Number
    )

[1] => Array
    (
        [0] => Mick
        [1] => mick@mick.com
        [2] => 01234 324234
    )

[2] => Array
    (
        [0] => james
        [1] => james@james.com
        [2] => 
    )

[3] => Array
    (
        [0] => reg
        [1] => reg@reg.com
        [2] => 10293 467289
    )

)

我希望循环并删除这些空值并将电子邮件和电话号码组合到信息中,最终得到一个类似于

Array
(
[0] => Array
    (
        [0] => Name
        [1] => Info

    )

[1] => Array
    (
        [0] => Mick
        [1] => mick@mick.com + 01234 324234
    )

[2] => Array
    (
        [0] => james
        [1] => james@james.com
    )

[3] => Array
    (
        [0] => reg
        [1] => reg@reg.com + 10293 467289
    )

)

这是我当前的脚本,我收到了错误;

<b>Warning</b>:  array_filter() expects parameter 2 to be a valid callback, no array or string given in <b>C:\Users\Lydia\Documents\XAMPP\htdocs\CSV.php</b> on line <b>21</b><br />

每次我循环通过 changeRow() 函数,任何帮助都非常感谢

index.php

<?php
include 'CSV.php';
header('Content-type: text/plain');

$file = read_csv('Book1.csv');

$input = changeRow($file);

CSV.php …… ....

    function changeRow($rows){

    $len = count($rows);

    for($i = 0; $i < $len; $i++){

        $rows = array_filter($rows[0],0);



    }


}

【问题讨论】:

    标签: php arrays csv


    【解决方案1】:

    可以使用array_map() 代替foreach()。示例:

    $file = read_csv('Book1.csv');
    $input = array_map(function($v){
        $phone = (isset($v[2]) && $v[2]) ? ' + '. $v[2] : '';
        return array($v[0], $phone);
    },$file );
    if(isset($result[0][1])) $result[0][1] = 'Info';
    
    print '<pre>';
    print_r($input);
    print '</pre>';
    

    【讨论】:

      【解决方案2】:

      我将提供两种方法来输出请求的数组结构。 (PHP Demo Link) 这些方法迭代数组,检查迭代是否正在处理“列标题”子数组,然后使用+ 有条件地将子数组元素[2] 的值附加到子数组元素[1] .

      方法一:foreach()

      foreach($array as $index=>$item){
          if(!$index){
              $result[]=['Name','Info'];
          }else{
              $result[]=[$item[0],$item[1].(strlen($item[2])?" + $item[2]":'')];
          }
      }
      var_export($result);
      

      方法#2 array_map()

      var_export(
          array_map(function($index,$item){
              if(!$index){
                  return ['Name','Info'];
              }else{
                  return [$item[0],$item[1].(strlen($item[2])?" + $item[2]":'')];
              }
          },array_keys($array),$array)
      );
      

      输出:(来自任一方法)

      array (
        0 => 
        array (
          0 => 'Name',
          1 => 'Info',
        ),
        1 => 
        array (
          0 => 'Mick',
          1 => 'mick@mick.com + 01234 324234',
        ),
        2 => 
        array (
          0 => 'james',
          1 => 'james@james.com',
        ),
        3 => 
        array (
          0 => 'reg',
          1 => 'reg@reg.com + 10293 467289',
        ),
      )
      

      ps。如果要删除每次迭代的$index==0 检查,您可以在循环完成后手动覆盖第一个子数组,如下所示: (PHP Demo Link) *这只是意味着您将“写入”数据到第一个子数组两次。

      foreach($array as $item){
          $result[]=[$item[0],$item[1].(strlen($item[2])?" + $item[2]":'')];
      }
      $result[0]=['Name','Info'];
      var_export($result);
      

      $result=array_map(function($item){return [$item[0],$item[1].(strlen($item[2])?" + $item[2]":'')];},$array);
      $result[0]=['Name','Info'];
      var_export($result);
      

      pps。 “Passing by Reference可以用于此任务,但我选择不使用&amp;$array,因为它可能会导致麻烦“downscript”,许多开发人员建议不要使用它,直到其他方法不足。下面是它的样子:(PHP Demo Link)

      foreach($array as &$item){
          if(strlen($item[2])) $item[1].=" + $item[2]";
          unset($item[2]);
      }
      $array[0]=['Name','Info'];
      var_export($array);
      unset($item);  // var_export($item); // ($item = NULL)
      

      【讨论】:

      • @JoeSmith 如果我的回答满意,请给它打上绿色的勾,这样这个页面就可以用来关闭新的重复问题。 (另一个答案有多个错误/问题,因此此页面不能用作预先存在的参考。
      猜你喜欢
      • 2014-06-04
      • 1970-01-01
      • 2019-07-10
      • 2019-03-25
      • 1970-01-01
      • 2021-12-15
      • 2018-04-01
      相关资源
      最近更新 更多