#php #arrays #foreach
#php #массивы #предначертание
Вопрос:
То, что я пытаюсь сделать, это перебирать массив элементов и добавлять каждый из них в мою базу данных. После их добавления в БД функция ‘Add’ class’ должна возвращать статус и сообщение каждого элемента. Я пытаюсь добавить каждый из этих статусов и сообщений в outcome
массив, который находится за пределами моего foreach
цикла, а затем, когда цикл завершается, я пытаюсь распечатать outcome
массив, но я продолжаю получать эту ошибку : Trying to get property of non-object in <b>pathToTheLoopScheduleController.php</b> on line <b>38</b><br />
. Указанная строка указывает на то, где я пытаюсь добавить материал в свой outcome
массив.
В любом случае, вот мой код:
$returned = array();
foreach ($dates as $date) {
$startStr = $date . " " . $start;
$startDate = DateTime::createFromFormat('d/m/Y H:i:s', $startStr);
$endStr = $date . " " . $end;
$endDate = DateTime::createFromFormat('d/m/Y H:i:s', $endStr);
$sdl = new Schedule($startDate, $endDate, null);
$outcome = $sdl->createSlot();
$returned['status'] = $outcome->status;
$returned['message'] = $outcome->message;
}
print json_encode($returned);
Обратите внимание, что я попытался заполнить свой массив с помощью описанного выше метода, а также с помощью следующего метода:
$returned[] = array(
$status => $outcome->status,
$message => $outcome->message
);
Я не включаю код для Schedule
класса, потому что я совершенно уверен, что он работает, потому что материал, который я отправляю для добавления в базу данных, действительно добавляется, а также потому, что, если я заменяю часть, в которой я пытаюсь заполнить массив, на a print // the outcomes
, он фактически печатает его.
Редактировать: когда я делаю var_dump($outcome);
вместо того, чтобы пытаться добавить результаты $returned
, я получаю это:
array(2) {
["status"]=>
string(7) "success"
["message"]=>
string(62) "New slot added from 2016-10-10 09:00:01 to 2016-10-10 10:00:00"
}
array(2) {
["status"]=>
string(7) "success"
["message"]=>
string(62) "New slot added from 2016-10-17 09:00:01 to 2016-10-17 10:00:00"
}
array(2) {
["status"]=>
string(7) "success"
["message"]=>
string(62) "New slot added from 2016-10-24 09:00:01 to 2016-10-24 10:00:00"
}
array(2) {
["status"]=>
string(7) "success"
["message"]=>
string(62) "New slot added from 2016-10-31 09:00:01 to 2016-10-31 10:00:00"
}
Комментарии:
1. Кажется, что $outcome не является объектом. Не могли бы вы опубликовать вывод var_dump($outcome)?
2. Попробуйте сначала напечатать
$outcome
и посмотреть переменные, вытекающие из этого, и убедитесь, что отображаются astatus
и amessage
…3. Я добавил вывод var_dump
Ответ №1:
Похоже, что значение $outcome
является массивом, а не объектом, поэтому вы можете попробовать преобразовать результат в объект, и это должно позволить вам использовать объектную нотацию для доступа к значениям.
$outcome = (object)$sdl->createSlot();
$returned['status'] = $outcome->status;
$returned['message'] = $outcome->message;
или, в качестве альтернативы, используйте обозначение массива
$outcome = $sdl->createSlot();
$returned['status'] = $outcome['status'];
$returned['message'] = $outcome['message'];
Комментарии:
1. Вторая часть вашего ответа (обозначение массива) сделала свое дело. Спасибо!
Ответ №2:
Просто создайте массив в каждой строке массива.
$returned[] = array("status" => $outcome->status, "message" =>$outcome->message );