所以我有一个多维度数组$ lines,它是从csv文件生成的。它填充了如下所示的记录:
[0] => 038572
[1] => L
[2] => Testing
[3] => BQ
[4] =>
[5] => 52.40308886
[6] => -0.19266809
[7] => 01/12/2018
[8] =>
[9] => B
[10] =>
[11] => 5
[12] =>
[13] =>
[14] =>
[15] =>
[16] => ldn d 5BQ
[17] => 038572
[18] =>
我也有全部为空的记录,其中包含:
[16] => ,
我要取消设置的这些记录。所以我尝试了以下方法:
foreach($lines as $element) {
if ($element[16] == ",") {
unset($element);
}
}
但是当我print_r数组$ lines时,我仍然可以看到那些部分为空的记录。
答案 0 :(得分:0)
您正在循环中使用一个临时副本,因此当您取消设置$element
时,它对原始$lines
数组没有影响。您可以使用引用,也可以从原始数组中取消设置值:
foreach ($lines as $index => $element) {
if ($element[16] === ',') {
unset($lines[$index][16]);
}
}
或者类似这样的东西:
for ($i = 0, $_i < count($lines); $i < $_i; $i++) {
if ($lines[$i][16] === ',') {
unset($lines[$i][16]);
}
}
或其他十二种方法中的任何一种...
请注意,在此处使用unset()
实际上会从数组中删除该项,这可能会导致列的对齐方式不同,具体取决于代码的编写方式。与其取消设置,不如将其设置为null。
答案 1 :(得分:0)
您无法修改作用于$ element的$ lines的原因是您需要通过引用传递
为了能够直接在循环内修改数组元素,在$ value之前加上>&。在这种情况下,该值将通过引用分配。 阅读http://php.net/manual/en/control-structures.foreach.php)
但是在您的情况下,我将创建另一个数组来存储有效记录:
$valid_records = [];
$exclude = [" ", ", "];
foreach($lines as $element) {
if (!in_array($element, $exclude)) {
array_push($valid_records, $element);
}
}
$lines = $valid_records;
它可能不那么优雅且节省内存,但是很高兴不会与unset
发生冲突答案 2 :(得分:0)
如果您尝试从数组中删除该空记录:
foreach( $lines as $key => $val ) {
if( trim( $val[16] ) == ',' ) { // trim if there is any space with ','
unset( $lines[$key] );
}
}
print_r( $lines );