Как построить многомерный массив json с оператором PHP while? - PullRequest
0 голосов
/ 17 января 2020

Как видно из приведенного ниже кода, в 2020-01-13 есть две встречи, но они генерируются как отдельный массив. Как я могу поместить их обоих в один и тот же массив, поскольку они находятся в один и тот же день? Я извлекаю всю информацию из базы данных, используя mysqli, но ради этого кода я печатаю только необходимое. Это работает, но мне нужно знать, как собрать встречи с одинаковой датой в одном массиве.

php

//declare variable
$result = array();

//iterate
while($schedule = $result_data->fetch_assoc()){

//start time conversion into american time
// 24-hour time to 12-hour time 
$start_time  =date("g:i a", strtotime($schedule['start_time']));

//end time conversion into american time
$end_time  =date("g:i a", strtotime($schedule['end_time']));

$my_schedule_start .= $start_time;
$my_schedule_end .= $end_time;

$schedule_date= $schedule['cleaning_date'];


$result[] = array(
"$schedule_date" => [
    "number"=>'1',
    "badgeClass"=>'',
    "url"=>'url',

    "dayEvents"=>[
    "title"=>$schedule['first_name'].' '.$schedule['last_name'],
    "status"=>$schedule['cleaning_status'],
    "time"=>$start_time .' - '.$end_time
    ]
]
);  

}

//send response back to jquery
header('Content-Type: application/json');
echo json_encode($result);

this php печатает это

[{"2020-01-15":{
    "number":"1",
    "badgeClass":"",
    "url":"url",
    "dayEvents":{
        "title":"Jen Doe",
        "status":"Booked",
        "time":"11:00 am - 12:00 pm"}
        }
        },
        {"2020-01-13":{
            "number":"1",
            "badgeClass":"",
            "url":"url",
            "dayEvents":{
                "title":"John Doe",
                "status":"Booked",
                "time":"2:00 pm - 5:00 pm"}
                }
                },
                {"2020-01-13":{
                    "number":"1",
                    "badgeClass":"",
                    "url":"url",
                    "dayEvents":{
                        "title":"Alfred Doe",
                        "status":"Booked",
                        "time":"11:00 am - 12:00 pm"}
                        }
                        }
                     ]

но мой желаемый результат - это

[{
        "2020-01-15": {
            "number": "1",
            "badgeClass": "",
            "url": "url",
            "dayEvents": {
                "title": "Jen Doe",
                "status": "Booked",
                "time": "11:00 am - 12:00 pm"
            }
        }
    },
    {
        "2020-01-13": {
            "number": "2",
            "badgeClass": "",
            "url": "url",
            "dayEvents": [{
                    "title": "John Doe",
                    "status": "Booked",
                    "time": "2:00 pm - 5:00 pm"
                },
                {
                    "title": "Alfred Doe",
                    "status": "Booked",
                    "time": "11:00 am - 12:00 pm"
                }
            ]
        }
    }
]

Ответы [ 2 ]

1 голос
/ 17 января 2020

Этот код при создании расписания создает события каждого дня, проиндексированные самой датой, затем при обнаружении нового события он проверит, уже установлена ​​ли эта дата. Если так, это увеличит счет и добавит новое событие. Единственная сложность заключается в том, что ему нужно проверить, имеет ли он только 1 существующую запись - это нужно сначала преобразовать в массив. Чтобы удалить индекс, json_encode() использует array_values() first ...

while($schedule = $result_data->fetch_assoc()){
    //start time conversion into american time
    // 24-hour time to 12-hour time
    $start_time  =date("g:i a", strtotime($schedule['start_time']));

    //end time conversion into american time
    $end_time  =date("g:i a", strtotime($schedule['end_time']));

    $my_schedule_start .= $start_time;
    $my_schedule_end .= $end_time;

    $schedule_date= $schedule['cleaning_date'];

    if ( isset($result[$schedule_date])){
        // Increment count
        $result[$schedule_date][$schedule_date]["number"]++;
        // Convert single item to array
        if ( !isset($result[$schedule_date][$schedule_date]["dayEvents"][0]))    {
            $result[$schedule_date][$schedule_date]["dayEvents"] = 
                [$result[$schedule_date][$schedule_date]["dayEvents"]];
        }
        // Add in new event to dayEvents
        $result[$schedule_date][$schedule_date]["dayEvents"][] = [
            "title"=>$schedule['first_name'].' '.$schedule['last_name'],
            "status"=>$schedule['cleaning_status'],
            "time"=>$start_time .' - '.$end_time
        ];

    }
    else    {
        // Create new days schedule
        $result[$schedule_date] = [
            "$schedule_date" => [
                "number"=>'1',
                "badgeClass"=>'',
                "url"=>'url',

                "dayEvents"=>[
                    "title"=>$schedule['first_name'].' '.$schedule['last_name'],
                    "status"=>$schedule['cleaning_status'],
                    "time"=>$start_time .' - '.$end_time
                ]
            ]
        ];
    }

}

header('Content-Type: application/json');
echo json_encode(array_values($result), JSON_PRETTY_PRINT);
0 голосов
/ 17 января 2020

Основываясь на моих наблюдениях по приведенному выше коду и желаемом выводе, вы можете сделать что-то вроде этого:

$scheduledDate = date('Y-m-d');
$my_schedule_start = "";
$my_schedule_end = "";
$finalResult = [];

while($schedule = $result_data->fetch_assoc()){
    $start_time  =date("g:i a", strtotime($schedule['start_time']));
    $end_time  =date("g:i a", strtotime($schedule['end_time']));

    $my_schedule_start .= $start_time;
    $my_schedule_end .= $end_time;

    $schedule_date= $schedule['cleaning_date'];

    $res = new stdClass;

    $res->number = 1;
    $res->badgeClass = "";
    $res->url = 'url';

    $dayEvents = new stdClass;
    $dayEvents->title = $schedule['first_name'].' '.$schedule['last_name'];
    $dayEvents->status = $schedule['cleaning_status'];
    $dayEvents->time = $start_time .' - '.$end_time;

    $res->dayEvents = $dayEvents;
    $finalResult[] = $res;
}

echo json_encode($finalResult);

Что следует отметить здесь:

1.) Я дал кодовая база на первой записи в предоставленном выводе. если вы хотите на go глубже, вместо использования stdClass на $dayEvents, вы можете напрямую объявить $dayEvents как массив и использовать отдельный stdClass внутри, а pu sh - dayEvents, как я сделали для массива $finalResult.

2.) Вы можете получить уведомление о $my_schedule_start и $my_schedule_end, не объявленных ранее, поэтому я взял на себя смелость объявить их за пределами Хотя l oop с пустые значения. Но, пожалуйста, не стесняйтесь менять их в соответствии с вашими потребностями.

3.) Если $res = new stdClass; не работает, вы можете вместо этого попробовать $res = new \stdClass.

4.) Если вы найди любые синтаксические ошибки, пожалуйста, прости меня, так как я тоже человек:)

Резюме:

stdClass - это внутренняя функция PHP для объявления объектов в PHP. Вы также можете использовать короткий синтаксис, такой как $dayEvents = {}; вместо $dayEvents = new stdClass;.

. Вы можете найти больше информации о stdClass Здесь

Надеюсь, это поможет.

...