php добавление элементов в массив, который находится вне цикла foreach

#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 и посмотреть переменные, вытекающие из этого, и убедитесь, что отображаются a status и a message

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 );