很难在数组的foreach中从数组中删除记录

时间:2019-01-25 21:14:31

标签: php multidimensional-array foreach unset

所以我有一个多维度数组$ 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时,我仍然可以看到那些部分为空的记录。

3 个答案:

答案 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 );