Как исправить "вызов функции-члена xy в массиве" без использования foreach? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть объект внутри массива, который хранится в переменной $image

array(1) { [250]=> object(Magento\Framework\DataObject)#11025 (1) { ["_data":protected]=> array(26) { ["value_id"]=> string(3) "250" ["file"]=> string(58) "/i/n/insetktenschutz-doppeltuer-im-zargenrahmen_37_1_3.jpg"  ... } } }

Если я попытаюсь вернуть значение, например, такой файл:

echo $image->getFile();

Тогда Конечно, я получаю Неустранимая ошибка: необученная ошибка: вызов функции-члена getFile () для массива

Поэтому я попытался вызвать ее следующим образом:

$image = $image[0];
echo $image->getFile();

Но Я получаю Exception # 0 (Exception): Примечание: неопределенное смещение: 0

Итак, я попытался привести его к объекту:

$image = (object) $image;
echo $image->getFile();

Теперь я получаю Неустранимая ошибка: необработанная ошибка: вызов неопределенного метода stdClass :: getFile ()

Затем я использовал foreach:

foreach($image as $i) {
    echo $image->getFile();  // alternative: $image->getData('file')
}

, и это работает! Почему он работает с foreach и как я могу заставить его работать без него?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Вы можете попробовать с сбросить функцию массива PHP, чтобы получить первый элемент массива

$imageData = reset($image);
echo $imageData->getData("file");
0 голосов
/ 19 февраля 2020

Я не думаю, что в php есть что-то похожее на функционал forEach, в любом случае вы можете создать подкласс ArrayObject для инкапсуляции логики итерации c

class MyArray extends ArrayObject {
    public function getData($data){
        foreach($this as $element) {
            $element->getData($data);
        }
    }
}

// and use it
$my = new MyArray(array( /* put your objects here */ ));
$my->getData("file");

EDIT

более универсальная c версия

class MyArray extends ArrayObject {
    public function __call($name, $data){
        foreach($this as $element) {
            $element->$name(...$data);
        }
    }
}
$my = new MyArray(array( /* put your objects here */ ));
$my->getData("file");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...