php - 爆炸 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 */
?>
运行时,它返回我正在寻找的按钮行,它返回的值是文件中的绝对最后日期,而不是选择的实际日期。
解决方案
您所做的实际上是解析一个 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 */
推荐阅读
- django - Django REST Serializer 使用错误的模型进行序列化
- python - python文件写入程序运行时如何更新桌面上的文件大小
- javascript - 使用 d3.js 更新表数据
- c# - C#捕获从不在进程中的函数返回的异常?
- r - 如何设置仅在输入 3 时才显示集合向量的函数?
- javascript - 如果 URI 没有改变,例如在单页应用程序上,如何检测用户是否在新页面上?
- angular - Angular Kendo UI 全局访问
- php - 内连接循环通过
- git - 如何 git rebase 从另一个分支直接到 master 分支?
- javascript - 受控数字比例映射