У меня есть текстовое поле, которое представляет текст, который преобразуется в массив с помощью функции разнесения, а затем значения этого массива преобразуются в отдельные массивы в цикле foreach. Это функция
Запись в текстовой области
пн | 0000 | 0500 | Утренний взрыв | sally.jpg | DJ Sally
—
пн | 0500 | 1000 | Дневное мыло | wally.jpg | Wally
Код обработки
$itemlist = trim(preg_replace('/\n/', '', $itemlist ));
$itemlist = explode('---', $itemlist);
$dow = strtolower(date( 'D' ));
$tod = date( 'Hi' );
foreach($itemlist as $items) {
//this creates 2 arrays with 6 keys each
//array([0]=>mon[1]=>0000[2]=>0500[3]=>The Morning Blast[4]=>sally.jpg[5]=>DJ Sally)
//array([0]=>mon[1]=>0500[2]=>1000[3]=>Day Time Soap[4]=>wally.jpg[5]=>Wally)
$itempart = explode('|', $items);
if($itempart[0] == $dow && $tod >= $itempart[1] && $tod <= $itempart[2] ) {
?>
<div>
<h4><?php echo $itempart[3]; ?></h4>
<p><?php echo $itempart[5]; ?></p>
<img src="<?php echo $itempart[4]; ?>" />
</div>
<?php }
}//endforeach ?>
Проблемы
Условие, которое проверяет день недели и время суток, обрабатывает только первый массив и корректно возвращает выходной HTML, но как только время истечет, а затем станет false, последующий массив не будет обработан, даже если он равен true.
Логика кажется правильной, но она просто не будет работать. Что нужно, чтобы сделать это сканирование списка массивов и вернуть только тот, который является истинным?
Этот код не завершен: цикл открыт, но никогда не завершается. Ваша проблема в том, что вы только обрезаете \ n, в то время как вы также должны ожидать других символов (возврат каретки, не только перевод строки). Либо правильно устранить разрывы строк
$itemlist= trim( preg_replace( '/\\s*[\\n\\r]\\s*/', '', $itemlist ) );
или обрезать его позже с
$itempart= explode( '|', trim( $items ) );
в противном случае ваше состояние не удается, потому что fri
в вашем элементе массива добавляется возврат каретки.
Других решений пока нет …