首页 > 解决方案 > 爆炸 Foreach

问题描述

PHP 的新手,但我的雇主让我从事一个需要了解它的项目。我有一个带有“;”的文本文件(date.txt)作为分隔符。这是文本文件中的示例:

March 4, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
March 11, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
March 18, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
March 25, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM

我们将让用户从按钮中选择一个日期——假设他们选择了 2020 年 3 月 11 日。然后我需要他们能够看到与 2020 年 3 月 11 日“关联”的选项(即上午 7:30,8 :00 上午等)。

我知道我可以使用 foreach/if 语句来完成此操作,但我被卡住了!这是我到目前为止的代码:

<?PHP
$file_handle = fopen("resources/date.txt", "rb");

while (!feof($file_handle)) {

$path = fgets($file_handle);
$explode = explode(";", $path); //make array from values
foreach ($explode as $segment) {
    if (!in_array($values['March 4, 2020'], $array)) { //check whether catid is in array
        print $parts[1] . $parts[2] . $parts[3] . $parts[4] . $parts[5] . $parts[6] ."<BR>"; // execute whatever you want
    }
}
}
fclose($file_handle);
?>

如果我按原样执行它,我最终会输出大量“2020 年 12 月 30 日”。

编辑:这就是我现在所做的:

<?php
	$dateSelected = "March 4, 2020";

if ($fd = fopen("resources/date.txt", "r")) {
    while (($data = fgetcsv($fd, 10000, ";")) !== false) {
		$parts = explode(';', $line_of_text);
        if ($data[0] == $dateSelected) {
            $option1 = $parts[1]. "<BR>";
			$option2 = $parts[2]. "<BR>";
			$option3 = $parts[3]. "<BR>";
			$option4 = $parts[4]. "<BR>";
			$option5 = $parts[5]. "<BR>";
			$option6 = $parts[6]. "<BR>";
            break;
        }
    }
}
?>
<a class="btn-lg"> <?php
echo $option1; ?> </a> <?php
?>
<a class="btn-lg"> <?php
echo $option2; ?> </a> <?php
?>
<a class="btn-lg"> <?php
echo $option3; ?> </a> <?php
?>
<a class="btn-lg"> <?php
echo $option4; ?> </a> <?php
?>
<a class="btn-lg"> <?php
echo $option5; ?> </a> <?php
?>
<a class="btn-lg"> <?php
echo $option6; ?> </a> <?php


/* Gives you 7:30 AM, 8:00 AM, 8:30 AM, 9:00 AM, 9:30 AM, 10:00 AM */
		
		
		?>

运行时,它返回我正在寻找的按钮行,它返回的值是文件中的绝对最后日期,而不是选择的实际日期。

标签: phpforeachwhile-loop

解决方案


您所做的实际上是解析一个 CSV 文件,并希望将给定行中的第一个单元格与您选择的日期相匹配,然后返回该行中的后续单元格。

这可以类似于以下方式完成:

$csvData = <<<'CSVDATA'
March 4, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
March 11, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
March 18, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
March 25, 2020; 7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM
CSVDATA;

$data = [];

foreach (explode("\n", $csvData) as $line) {
    $data[] = str_getcsv($line, ";");
}

$dateSelected = "March 4, 2020";

foreach ($data as $row) {
    if ($row[0] == $dateSelected) {
        $options = array_slice($row, 1);
        break;
    }
}

echo implode(",", $options);
/* Gives you 7:30 AM, 8:00 AM, 8:30 AM, 9:00 AM, 9:30 AM, 10:00 AM */

在您的情况下,您将从文件而不是字符串中读取,因此您将使用它fget_csv()

换句话说,你会做更像这样的事情......

$dateSelected = "March 4, 2020";

if ($fd = fopen("resources/date.txt", "rb")) {
    while (($data = fgetcsv($fd, 10000, ";")) !== false) {
        if ($data[0] == $dateSelected) {
            $options = array_slice($data, 1);
            break;
        }
    }
}

echo implode(",", $options);
/* Gives you 7:30 AM, 8:00 AM, 8:30 AM, 9:00 AM, 9:30 AM, 10:00 AM */

推荐阅读