0

このスクリプト:

<?php

$lines[] = '';
$lines[] = 'first line   ';
$lines[] = 'second line ';
$lines[] = '';
$lines[] = 'fourth line';
$lines[] = '';
$lines[] = '';

$lineCount = 1;
foreach($lines as $line) {
    echo $lineCount . ': [' . trim($line) . ']<br/>'; 
    $lineCount++;
}

?>

この出力を生成します:

1: []
2: [first line]
3: [second line]
4: []
5: [fourth line]
6: []
7: []

上記のスクリプトを変更して、前後空白のエントリも削除するが、内部の空白のエントリは削除しないようにして、これを出力するようにするための最も速くて効率的な方法は何ですか。

1: [first line]
2: [second line]
3: []
4: [fourth line]

foreachループを使用することもできますが、array_filterなど、はるかに効率的な方法があると思います。

4

2 に答える 2

1
// find the first non-blank line
$size = count($lines);
while ($lines[$i] === '' && $i < $size) {
  $i++;
}
$start = $i;

// find the last non-blank line
$i = $size;
while ($lines[$i - 1] === '' && $i > $start) {
  $i--;
}
$end = $i;

// traverse between the two    
for ($i=$start; $i<$end; $i++) {
  echo ($i + $start) . ': [' . trim($lines[$i]) . ']<br/>';
}
于 2010-05-02T10:48:46.150 に答える
1

array_sliceトリミングされた配列を作成する必要があります。

function trimLines($lines) {
    $end = count($lines);
    for ($start=0; $lines[$start] === ''; ++$start) {
        if ($start == $end) {
            return array();
        }
    }
    do { --$end; } while ($lines[$end] === '');
    return array_slice($lines, $start, $end-$start+1);
}
于 2010-05-02T11:00:16.280 に答える