У меня есть функция, которая загружает фотографии с сервера, используя RETS. Я хочу выбрать путь к фотографиям и сохранить их в файле JSON для отображения на карусели. Функция массива находится внутри цикла foreach, и она будет инициализирована, но будет хранить только один объект за раз. Каждый раз, когда цикл проходит через объекты, он уничтожает предыдущий и просто сохраняет новый.
function downloadPhotos($results, $rets) {
if (is_null($results) == false) {
$all_IDs = $results->lists('Matrix_Unique_ID');
foreach ($all_IDs as $Id) {
if(!file_exists("/var/www/html/mls-search/search-ui/public/img/")){
mkdir("/var/www/html/mls-search/search-ui/public/img/");
}
$photos = $rets->GetObject('Property', 'XLargePhoto', $Id, '*', 0);
foreach ($photos as $photo) {
if ($photo->isError() == false ) {
file_put_contents("/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg", $photo->getContent());
$dataImage = array();
$dataImage['id'] = $photo->getContentId();
$dataImage['image'] = "/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg";
file_put_contents("/var/www/html/mls-search/search-ui/public/propimg.json", json_encode($dataImage));
}
}
}
}
}
Фактический результат, как я сказал выше, заключается в том, что он уничтожает предыдущий и просто сохраняет новый каждый раз, когда цикл повторяется по объекту. Желаемый результат состоит в том, что он будет просто добавлять массив с каждой новой итерацией.
Спасибо.
EDIT: обновленный код с решением, которое работает прямо сейчас:
function downloadPhotos($results, $rets) {
$dataImage = array();
if (is_null($results) == false) {
$all_IDs = $results->lists('Matrix_Unique_ID');
$dataImage = array();
foreach ($all_IDs as $Id) {
if(!file_exists("/var/www/html/mls-search/search-ui/public/img/")){
mkdir("/var/www/html/mls-search/search-ui/public/img/");
}
$photos = $rets->GetObject('Property', 'XLargePhoto', $Id, '*', 0);
foreach ($photos as $photo) {
if ($photo->isError() == false ) {
file_put_contents("/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg", $photo->getContent());
array_push($dataImage, $dataImage['id'] = $photo->getContentId(), $dataImage['image'] = "/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg");
file_put_contents("/var/www/html/mls-search/search-ui/public/propimg.json", json_encode($dataImage));
}
}
}
}
}
ИЗМЕНИТЬ 2
У меня были проблемы с этим первым обновленным кодом. Файл JSON продолжал назначать числовые значения ключам вместо ключей «id» и «images», которые мне были нужны. Немного повозился с array_push() и, наконец, получил нужный мне результат:
function downloadPhotos($results, $rets) {
$dataImage = array();
if (is_null($results) == false) {
$all_IDs = $results->lists('Matrix_Unique_ID');
foreach ($all_IDs as $Id) {
if(!file_exists("/var/www/html/mls-search/search-ui/public/img/")){
mkdir("/var/www/html/mls-search/search-ui/public/img/");
}
$photos = $rets->GetObject('Property', 'XLargePhoto', $Id, '*', 0);
foreach ($photos as $photo) {
if ($photo->isError() == false ) {
file_put_contents("/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg", $photo->getContent());
array_push($dataImage, $dataImage[] = array("id" => $photo->getContentId(), "images"=>"/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg"));
file_put_contents("/var/www/html/mls-search/search-ui/public/propimg.json", json_encode($dataImage));
}
}
}
}
}
Выход:
{
"id": "22128021",
"images": "\/var\/www\/html\/mls-search\/search ui\/public\/img\/22128021-0.jpg"
},
{
"id": "22128021",
"images": "\/var\/www\/html\/mls-search\/search ui\/public\/img\/22128021-0.jpg"
},
{
"id": "22128021",
"images": "\/var\/www\/html\/mls-search\/search ui\/public\/img\/22128021-1.jpg"
}
ПОСЛЕДНИЕ РЕДАКТИРОВАНИЯ
Последним прогоном, который я сделал, было дублирование ключей в файле JSON. Явно не идеал. Я обнаружил, что это произошло потому, что я дважды вызывал $dataImage в функции array_push. Когда я удалил этот дополнительный параметр, я продолжал получать предупреждения от PHP о том, что он ожидает два параметра. Моя работа заключалась в том, чтобы создать фиктивный массив и вставить его в функцию array_push.
По общему признанию, это не очень хороший код, я подозреваю. Но, учитывая количество знаний, которые у меня есть об этом прямо сейчас, это был обходной путь, который я получил, и теперь я получаю результаты, как и ожидалось.
Код:
function downloadPhotos($results, $rets) {
$dummyImage = array();
if (is_null($results) == false) {
$all_IDs = $results->lists('Matrix_Unique_ID');
foreach ($all_IDs as $Id) {
if(!file_exists("/var/www/html/mls-search/search-ui/public/img/")){
mkdir("/var/www/html/mls-search/search-ui/public/img/");
}
$photos = $rets->GetObject('Property', 'XLargePhoto', $Id, '*', 0);
foreach ($photos as $photo) {
if ($photo->isError() == false ) {
file_put_contents("/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg", $photo->getContent());
array_push($dummyImage, $dataImage[] = array("id" => $photo->getContentId(), "images"=>"/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg"));
file_put_contents("/var/www/html/mls-search/search-ui/public/propimg.json", json_encode($dataImage));
}
}
}
}
}
Эта тема, видимо, заблокирована. Причины его блокировки мне неясны, даже с учетом объяснения, но я бы сказал так: если кто-то всплывет в этой теме, я не рекомендую это решение. Вместо этого следуйте некоторым предложениям в комментариях и исследуйте их. Это было то, что я чувствовал, что должен был сделать, учитывая программу, с которой я работал, чтобы получить и обработать эти данные.
Если вы используете PHRETS и пытаетесь сделать что-то подобное здесь, попробуйте, и если у вас есть более элегантный подход, я полностью согласен.
Спасибо.
$dataImage = array();
внутри своего цикла, объявите его снаружи - person Brett Gregson   schedule 29.08.2019