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