Сложность удаления записи из массива в пределах foreach массива - PullRequest
0 голосов
/ 26 января 2019

Итак, у меня есть многомерный массив $ 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);
    }
}

Но когда я печатаю_ строки массива $, я все равно вижу эти частично пустые записи.

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Причина, по которой вы не можете изменять $ строк, действующих на $ element, заключается в том, что вам нужно передать его по ссылке

Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед $ 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

0 голосов
/ 26 января 2019

Если вы пытаетесь удалить эту пустую запись из массива:

foreach( $lines as $key => $val ) {
    if( trim( $val[16] ) == ',' ) { // trim if there is any space with ','
        unset( $lines[$key] );
    }
}

print_r( $lines );
0 голосов
/ 26 января 2019

Вы работаете с временной копией внутри цикла, поэтому, если вы сбросите $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() фактически удалит элемент из массива, что может привести к неправильному выравниванию ваших столбцов в зависимости от того, как написан ваш код.Вместо того, чтобы сбросить его, вы можете установить его на ноль.

...