2012-04-24 4 views
2

Я изучаю, как использовать PHP. Я прочитал содержимое файла в массиве и назначил имя переменной для каждого индекса в массиве.php foreach loop redundancy

Например:
$words = file("example.txt"); #each line of the file will have the format a, b, c , d

foreach ($words in $word) { 
$content = explode(",", $word); #split a, b, c, d 
list($a, $b, $c, $d) = $content; 
do something 
} 

/* And now I want to read file, split the sentence and loop over the array again, but 
the last statement will do something else different: */ 
foreach ($words in $word) { 
$content = explode(",", $word); #split a, b, c, d 
list($a, $b, $c, $d) = $content; 
do something else different 
} 

Что я могу сделать, чтобы уменьшить эту избыточность? Как вы можете видеть, я не могу создать функцию, потому что последний оператор делает что-то другое для массива. Но процесс чтения файла, разделив предложения, и назначение ВАР те же

Спасибо

ответ

2

Я предполагаю, что вы имели в виду ввести foreach($words as $word), с «как» вместо «в», но это просто незначительная вещь по сравнению с вопросом.

Можно, конечно, уменьшить избыточность хранения результатов explode звонков:

$lines = Array(); 
foreach($words as $word) { 
    list($a,$b,$c,$d) = $lines[] = explode(",",$word); 
    // do something here 
} 

foreach($lines as $line) { 
    list($a,$b,$c,$d) = $line; 
    // do something else 
} 

Таким образом, вы не должны explode линии снова.

0

Ну, если вы просто собираетесь работать с $ a, $ b, $ c и $ d и оставлять $ content неповрежденным, просто перечислите $ content снова, чтобы сделать что-то другое.

foreach ($words in $word) { 
    $content = explode(",", $word); #split a, b, c, d 

    list($a, $b, $c, $d) = $content; 
    // do something, and when you're done: 

    list($a, $b, $c, $d) = $content; 
    // do something else different. 
} 
0

Существует множество вариаций. Трудная часть - это определение общих частей, которые можно отвлечь. Иногда вы делаете код хуже, пытаясь сделать его слишком общим. Но вот образец, использующий анонимные функции.

function foo($filename, $func) { 
    $words = file($filename); 
    foreach ($words as $word) { 
     $content = explode(",", $word); 
     call_user_func_array($func, $content); 
    } 
} 

foo('people.txt', function($a, $b, $c, $d) { 
    echo "$a\n"; 
}); 

foo('people.txt', function($a, $b, $c, $d) { 
    echo $b + $c; 
}); 

Вам также может быть заинтересуют array_map, array_walk и array_reduce, хотя лично я не чувствую Theyre часто лучше, чем цикл ... Еогеасп РНР чертовски удивительным.