Json значений в PHP календарь событий, если не распроданы - PullRequest
0 голосов
/ 20 марта 2020

Я застрял на несколько дней, пытаясь найти лучший способ для go делать то, что мне нужно. У меня есть json URL-адрес, который я получаю данные из массива, как показано ниже. Диапазон дат может составлять от месяца до полных лет. Мне нужно проверить, если билеты soldout или нет. Если soldout равно true, то в эту дату в календаре должно отображаться soldout. Если soldout равно false, в календаре должна отображаться переменная $url, которая соответствует дате в start.

В формате массива, с которым я пытаюсь работать

array(3) { 
    [0]=> object(stdClass)#1 (4) { 
        ["id"]=> string(3) "165"  
        ["start"]=> string(18) "05/02/2020 1:00 PM" 
        ["title"]=> string(19) "Event 1:00 PM" 
        ["alldetails"]=> array(1) { 
            [0]=> object(stdClass)#2 (1) {  
                ["soldout"]=> bool(false) 
            } 
        } 
    } 
    [1]=> object(stdClass)#3 (4) { 
        ["id"]=> string(3) "166" 
        ["start"]=> string(18) "07/19/2020 5:00 PM"  
        ["title"]=> string(19) "Event 5:00 PM" 
        ["alldetails"]=> array(1) { 
            [0]=> object(stdClass)#4 (1) { 
                ["soldout"]=> bool(false) 
            } 
        } 
    } 
    [2]=> object(stdClass)#5 (4) { 
        ["id"]=> string(3) "167" 
        ["start"]=> string(18) "11/14/2020 9:00 PM" 
        ["title"]=> string(19) "Event 1:00 PM" 
        ["alldetails"]=> array(1) { 
            [0]=> object(stdClass)#6 (1) { 
                ["soldout"]=> bool(false)
            }
        } 
    } 
}

Извлечение данных из json массива

<?php
$array = 'https://URL/feed.json?start=2020-05-02&end=2020-11-14';
$obj = json_decode(file_get_contents($array));
foreach ($obj as $key => $value){
    $id = $value->id;
    $start = $value->start;
    $title = $value->title;
    $url = '<a href="https://url/'.$id.'">'.$title.'</a>';
    $details = $value->alldetails;
    foreach($details as $nested){
        $nested->soldout; //Outputs 1 or is blank
    }
}
?>

Чей-то календарь, в который я пытался вставить данные. Не уверен, стоит ли мне использовать это или попробовать свои силы в создании собственного. Не очень хорошо с форматированием даты в PHP Долгий путь обучения и большое количество необходимых переподготовок.

<?php
$monthNames = Array("January", "February", "March", "April", "May", "June", "July", 
"August", "September", "October", "November", "December");
if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n");
if (!isset($_REQUEST["year"])) $_REQUEST["year"] = date("Y");
$cMonth = $_REQUEST["month"];
$cYear = $_REQUEST["year"];
$prev_year = $cYear;
$next_year = $cYear;
$prev_month = $cMonth-1;
$next_month = $cMonth+1;
if ($prev_month == 0 ) {
    $prev_month = 12;
    $prev_year = $cYear - 1;
}
if ($next_month == 13 ) {
    $next_month = 1;
    $next_year = $cYear + 1;
}
?>
<table>
<tr align="center">
<td bgcolor="#999999" style="color:#FFFFFF">
<table width="100%" cellspacing="0" cellpadding="0" border="1">
<tr>
<td width="50%" align="left"><a href="<?php echo "?month=". $prev_month . "&year=" . $prev_year; ?>" style="color:#FFFFFF">Previous</a></td>
<td width="50%" align="right"><a href="<?php echo "?month=". $next_month . "&year=" . $next_year; ?>" style="color:#FFFFFF">Next</a></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<table width="100%" cellpadding="2" cellspacing="2" border="1">
<tr align="center">
<td colspan="7" bgcolor="#999999" style="color:#FFFFFF"><strong><?php echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td>
</tr>
<tr>
<th><strong>S</strong></th>
<th><strong>M</strong></th>
<th><strong>T</strong></th>
<th><strong>W</strong></th>
<th><strong>T</strong></th>
<th><strong>F</strong></th>
<th><strong>S</strong></th>
</tr>
<?php
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate ($timestamp);
$startday = $thismonth['wday'];

for ($i=0; $i<($maxday+$startday); $i++) {
    if(($i % 7) == 0 ) echo "<tr>";
    if($i < $startday) echo "<td></td>";    
    else echo "<td align='center' valign='middle' height='20px'>". ($i - $startday + 1) . "</td>";
    if(($i % 7) == 6 ) echo "</tr>";
}
?>
</table>
</td>
</tr>
</table>

Так что, чтобы разбить его еще раз, мне нужно вставить $url в календарь, где start дата соответствует правильной дате в календаре, но только если не soldout. Если soldout равно true, то, вероятно, оно должно просто echo "SoldOut"; или оставить пустым, что-то в этом роде. Любая помощь в правильном направлении для получения информации в календаре была бы отличной.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

@El_Vanja очень помог мне, научил меня созданию функции, которая бы выполняла именно то, что я искал. Кажется, я поступал неправильно, и он велел мне найти правильный ответ, помогая в этом, насколько это было возможно, и в то же время учил меня делать это самому. Слава @Il_Vanja, он станет отличным PHP учителем.

Вот рабочий код, по-прежнему нужно много чего почистить, включая операторы if для отображения событий, но так, как он работает, как и ожидалось.

<?php
$array = 'https://feed.json?start=2020-01-01&end=2100-12-31';
$obj = json_decode(file_get_contents($array,true));
$monthNames = Array("January", "February", "March", "April", "May", "June", "July", 
"August", "September", "October", "November", "December");
if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n");
if (!isset($_REQUEST["year"])) $_REQUEST["year"] = date("Y");
$cMonth = $_REQUEST["month"];
$cYear = $_REQUEST["year"];
$prev_year = $cYear;
$next_year = $cYear;
$prev_month = $cMonth-1;
$next_month = $cMonth+1;
if ($prev_month == 0 ) {
    $prev_month = 12;
    $prev_year = $cYear - 1;
}
if ($next_month == 13 ) {
    $next_month = 1;
    $next_year = $cYear + 1;
}
?>
<table>
<tr align="center">
<td>
<table width="100%" cellspacing="0" cellpadding="0" border="1">
<tr>
<td width="50%" align="left"><div class="m_buttons"><a href="<?php echo "?month=". $prev_month . "&year=" . $prev_year; ?>" ><strong>Previous Month</strong></a></div></td>
<td width="50%" align="right"><div class="m_buttons"><a href="<?php echo "?month=". $next_month . "&year=" . $next_year; ?>" ><strong>Next Month</strong></a></div></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<table width="100%" cellpadding="2" cellspacing="2" border="1">
<tr align="center">
<td colspan="7"><strong><?php echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td>
</tr>
<tr>
<th><strong>Sun</strong></th>
<th><strong>Mon</strong></th>
<th><strong>Tues</strong></th>
<th><strong>Wed</strong></th>
<th><strong>Thurs</strong></th>
<th><strong>Fri</strong></th>
<th><strong>Sat</strong></th>
</tr>
<?php
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate ($timestamp);
$startday = $thismonth['wday'];
function getDateCellContent(array $obj, $d) {
    $f_newdate = DateTime::createFromFormat('Y-m-j', $d);
    $f_newdate = $f_newdate->format('m/d/Y');
    $cellLink = '';
    $cellSoldout = '';
    foreach ($obj as $key => $value) {
        $start = $value->start;
        $a_newdate = DateTime::createFromFormat('m/d/Y g:i A', $start);
        $a_date = $a_newdate->format('m/d/Y');
        $a_time = $a_newdate->format('g:i A');
        $id = $value->id;
        $title = $value->title;
        if($a_date === $f_newdate) {
            foreach ($value->alldetails as $details) {
                $name = $details->name;
                $title = $value->title;
                $link1 = '<div class="link1"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link2 = '<div class="link2"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link3 = '<div class="link3"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link4 = '<div class="link4"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link5 = '<div class="link5"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link6 = '<div class="link6"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link7 = '<div class="link7"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link8 = '<div class="link8"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link9 = '<div class="link9"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link10 = '<div class="link10"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                $link11 = '<div class="link11"><a href="./setup/'.$id.'" target="_blank"><strong>'.$name.'<br />'.$a_time.'</strong></a></div>';
                if (!$details->soldout && $title === "Event 1:00 PM") {
                    $cellLink .=  $link1;
                }
                if (!$details->soldout && $title === "Event 10:00 AM") {
                    $cellLink .=  $link2;
                }
                if (!$details->soldout && $title === "Event 2:30 PM") {
                    $cellLink .=  $link3;
                }
                if (!$details->soldout && $title === "Mother's Day Event 1:00 PM") {
                    $cellLink .=  $link4;
                }
                if (!$details->soldout && $title === "Sunset Event 6:00 PM") {
                    $cellLink .=  $link5;
                }
                if (!$details->soldout && $title === "Spring Event 10:00 AM") {
                    $cellLink .=  $link6;
                }
                if (!$details->soldout && $title === "All Day Event 10:00 AM") {
                    $cellLink .=  $link7;
                }
                if (!$details->soldout && $title === "Winter Event 3:00 PM") {
                    $cellLink .=  $link8;
                }
                if (!$details->soldout && $title === "Winter Event 5:00 PM") {
                    $cellLink .=  $link9;
                }
                if (!$details->soldout && $title === "Winter Event 7:00 PM") {
                    $cellLink .=  $link10;
                }
                if (!$details->soldout && $title === "Father's Day Event 1:00 PM") {
                    $cellLink .=  $link11;
                }else{
                }
            }
        }
    }
    return $cellLink . $cellSoldout;
}
for ($i=0; $i<($maxday+$startday); $i++) {
    if(($i % 7) == 0 ) echo "<tr>";
    if($i < $startday) echo "<td></td>";    
    else echo "<td align='center' valign='middle' height='20px'>".($i - $startday + 1) ."<br />". getDateCellContent($obj, $cYear.'-'.$cMonth.'-'.($i - $startday + 1)) ."</td>";
    if(($i % 7) == 6 ) echo "</tr>";
}
?>
</table>
</td>
</tr>
</table>
0 голосов
/ 25 марта 2020

Дайте этому go и дайте мне знать, если это то, что вы хотите.

Я создал массив, который содержит все события для указанного диапазона дат. Затем, когда календарь заполняется, он проверяет, находится ли текущий день в массиве. Если это так, он показывает, доступен ли он или продан.

<?php
$monthNames = Array("January", "February", "March", "April", "May", "June", "July", 
"August", "September", "October", "November", "December");
if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n");
if (!isset($_REQUEST["year"])) $_REQUEST["year"] = date("Y");
$cMonth = $_REQUEST["month"];
$cYear = $_REQUEST["year"];
$prev_year = $cYear;
$next_year = $cYear;
$prev_month = $cMonth-1;
$next_month = $cMonth+1;
if ($prev_month == 0 ) {
    $prev_month = 12;
    $prev_year = $cYear - 1;
}
if ($next_month == 13 ) {
    $next_month = 1;
    $next_year = $cYear + 1;
}
?>
<table>
<tr align="center">
<td bgcolor="#999999" style="color:#FFFFFF">
<table width="100%" cellspacing="0" cellpadding="0" border="1">
<tr>
<td width="50%" align="left" onclick="changeDate(<?php echo $prev_month .','. $prev_year; ?>);" style="color:#FFFFFF">Previous</a></td>
<td width="50%" align="right" onclick="changeDate(<?php echo $next_month .','. $next_year; ?>);" style="color:#FFFFFF">Next</a></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center">
<table width="100%" cellpadding="2" cellspacing="2" border="1">
<tr align="center">
<td colspan="7" bgcolor="#999999" style="color:#FFFFFF"><strong><?php echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td>
</tr>
<tr>
<th><strong>S</strong></th>
<th><strong>M</strong></th>
<th><strong>T</strong></th>
<th><strong>W</strong></th>
<th><strong>T</strong></th>
<th><strong>F</strong></th>
<th><strong>S</strong></th>
</tr>
<?php
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate ($timestamp);
$startday = $thismonth['wday'];

$eventsArray = array();

$array = 'https://URL/feed.json?start='.$cYear.'-'.$cMonth.'-'.$startday.'&end='.$cYear.'-'.$cMonth.'-'.$maxday;
$obj = json_decode(file_get_contents($array));
foreach ($obj as $key => $value) {
    $id = $value->id;
    $start = $value->start;
    $title = $value->title;
    $url = '<a href="https://url/'.$id.'">'.$title.'</a>';
    $details = $value->alldetails;
    $date = new DateTime($value->start);
    $day = $date->format('d');
    foreach($details as $nested){
        $soldOut = $nested->soldout;
        array_push($eventsArray, array($day, $soldOut));
    }
}

for ($i=0; $i<($maxday+$startday); $i++) {
    $currentDay = $i - $startday + 1;
    if($i % 7 == 0) {
        echo "<tr>";
    }
    if($i < $startday) {
        echo "<td></td>";
    }else{
        // Check if current day is in array $currentEvents
        foreach($eventsArray as $event){
            if($event[0] == $currentDay) {
                if($event[1] == 1) { // event is soldout
                    echo "<td align='center' valign='middle' height='20px'><p>".$currentDay."</p><p>Soldout</p></td>";
                }else{
                   echo "<td align='center' valign='middle' height='20px'><p>".$currentDay."</p><p>Available</p></td>"; 
                }
            }else{
                echo "<td align='center' valign='middle' height='20px'><p>".$currentDay."</p><p>No Event</p></td>"; 
            }
        }
    }
    if($i % 7 == 6) {
        echo "</tr>";
    }
}
?>
</table>
</td>
</tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...