循环和清除数组

时间:2014-11-22 17:41:51

标签: php arrays csv

我在数组中有数组,所有数组都有不同的信息量。我的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
    )

)

我希望循环并删除这些空值,并将电子邮件和电话号码合并到Info中,最后使用类似于

的数组
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);



    }


}

2 个答案:

答案 0 :(得分:0)

可以使用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>';

答案 1 :(得分:0)

我将提供两种输出所请求的数组结构的方法。 (PHP Demo Link)这些方法迭代数组,检查迭代是否正在处理&#34;列标题&#34;是否为子数组,然后使用[2]作为粘合剂有条件地将子数组元素[1]中的值附加到子数组元素+

方法#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)*这只是意味着你将成为&#34 ;写&#34;数据到第一个子阵列两次。

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。 &#34; Passing by Reference&#34; 可以用于此任务,但我已选择不使用&$array,因为它可能会导致问题&#34;下标&#34;并且许多开发人员建议不要使用它,直到其他方法不合适。这是什么样的:(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)