Нужна небольшая помощь, чтобы понять, как добавить массив внутри цикла

У меня есть функция, которая загружает фотографии с сервера, используя 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 и пытаетесь сделать что-то подобное здесь, попробуйте, и если у вас есть более элегантный подход, я полностью согласен.

Спасибо.


person rvor    schedule 29.08.2019    source источник
comment
Вы повторно объявляете $dataImage = array(); внутри своего цикла, объявите его снаружи   -  person Brett Gregson    schedule 29.08.2019
comment
Только что сделал, проблема осталась.   -  person rvor    schedule 29.08.2019
comment
Опубликуйте свой обновленный код   -  person Brett Gregson    schedule 29.08.2019
comment
Я думаю, что только что нашел свое решение, используя array_push. Смотрите мой обновленный код.   -  person rvor    schedule 29.08.2019
comment
@rvor Если это действительно решение вашей проблемы, переместите его в ответ.   -  person duplode    schedule 30.08.2019
comment
@duplode Эта тема заблокирована, поэтому я не могу опубликовать ее в ответе прямо сейчас. Тем не менее, я обновил свой OP своим окончательным кодом.   -  person rvor    schedule 30.08.2019
comment
@rvor Вопрос был открыт повторно, поэтому вы можете опубликовать свой ответ сейчас.   -  person duplode    schedule 31.08.2019


Ответы (1)


array_push($dataImage, $dataImage['id'] = $photo->getContentId(), $dataImage['image'] = "/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg");

Это помещает результаты этих назначений в массив $dataImage. $dataImage['id'] и $dataImage['image'] по-прежнему будут содержать идентификатор и источник последнего изображения.

Вы можете попробовать что-то вроде:

$dataImage[$photo->getContentId()] = "/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg";

Затем повторите $dataImage:

foreach ($dataImage as $key => $value) {
    echo $key + ": " + $value;
}

РЕДАКТИРОВАТЬ: Вот пример использования массива ассоциативных массивов:

function downloadPhotos($results, $rets) {
    $allDataImages = 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());
                    $dataImage = array();
                    $dataImage['id'] = $photo->getContentId();
                    $dataImage['image'] = "/var/www/html/mls-search/search-ui/public/img/{$photo->getContentId()}-{$photo->getObjectId()}.jpg";
                    $allDataImages[] = $dataImage;
                }
            }
        }
    }
    file_put_contents("/var/www/html/mls-search/search-ui/public/propimg.json", json_encode($allDataImages));
}
person slim    schedule 29.08.2019
comment
Я вижу, что ты говоришь. Я видел это в моем последнем пробеге. Ваше предложение приближает меня, но мне все еще нужно, чтобы $photo->getContentId() был связан с ключом «id», а путь — с ключом «images». Пытаюсь понять, как это сделать. - person rvor; 29.08.2019
comment
Попробуйте использовать массив ассоциативных массивов. Создайте массив в исходном цикле, а затем добавьте его в основной массив. - person slim; 30.08.2019