Взорвать Foreach - PullRequest
       4

Взорвать Foreach

0 голосов
/ 08 февраля 2020

Всего новичков от ie до 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

У нас будет пользователь, который выбирает дату с помощью кнопки - скажем, они выбирают 11 марта 2020 года. Затем мне нужно, чтобы они могли видеть варианты " ассоциируется с 11 марта 2020 г. (т.е. 7:30, 8:00 и т. д. c.).

Я знаю, что могу sh выполнить это с помощью оператора 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);
?>

Если я выполню все как есть, я получу тонну «30 декабря 2020 года».

РЕДАКТИРОВАТЬ: Это то, что я получил до сих пор:

<?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 */
		
		
		?>

При запуске он возвращает строку нужных мне кнопок, возвращаемые значения соответствуют абсолютной последней дате в файле, а не фактической выбранной дате.

Ответы [ 3 ]

1 голос
/ 08 февраля 2020

По сути, вы анализируете файл 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 */
0 голосов
/ 08 февраля 2020

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

$str = "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";

$date = "March 4, 2020";

preg_match("/". preg_quote($date) . "; (.*)/", $str, $times);

echo $times[1];

Выходы:

7:30 AM; 8:00 AM; 8:30 AM; 9:00 AM; 9:30 AM; 10:00 AM

Код находит дату и затем захватывает оставшуюся часть строки.
Возвращает строку раз '; ' с разделителями, но может быть легко заменена на что угодно с помощью str_replace или разнесения, если это массив, который вы хочу.

https://3v4l.org/80qjf

0 голосов
/ 08 февраля 2020

@ Шериф опередил меня, но у меня было похожее решение. Я немного изменил его, чтобы перестроить каждую строку в виде ассоциативного массива с указанием даты и массива раз в нем:

// Building $file as string for example purposes
$file = "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";

$array = explode( PHP_EOL, $file ); // Blow this up at end of line, not ;
$final = array();

foreach( $array as $value ){
    // Get the parts of the string
    $parts = explode( ';', $value );

    // Set the Key
    $key = $parts[0];

    // Unset the key from the remainder
    unset( $parts[0] );

    // Cleanup whitespace
    $parts = array_map( 'trim', $parts );

    // Add the new key => value pairs to final array
    $final[$key] = $parts;
}

/*
    //$final output:
    array(4) {
        ["March 4, 2020"]=> array(6) {
            [1]=> string(7) "7:30 AM"
                …
            [6]=> string(8) "10:00 AM"
        }
        ["March 11, 2020"]=> array(6) {
            [1]=> string(7) "7:30 AM"
                …
            [6]=> string(8) "10:00 AM"
        }
            …
    }
*/

/*
    // $final['March 11, 2020'] output:
    array(6) {
    [1]=> string(7) "7:30 AM"
        …
    [6]=> string(8) "10:00 AM"
    }
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...