В настоящее время я вставляю данные из URL-адреса json api в свою базу данных, за исключением того, что некоторые массивы не заполнены, что приводит к ошибкам «неопределенный индекс».

Есть ли хороший способ с этим справиться? Конечно, проверка каждого индекса элемента с помощью оператора if isset и установка его только в том случае, если он доступен, будет работать, но это будет довольно утомительно для каждой записи.

        foreach($items['response']['groups'] as $item) {
            foreach($item['items'] as $item) {
                Bar::firstOrCreate([
                    'lat' => $item['venue']['location']['lat'],
                    'long' => $item['venue']['location']['lng'],
                    'postalCode' => $item['venue']['location']['postalCode'],
                    'city' => $item['venue']['location']['city'],
                    'state' => $item['venue']['location']['state'],
                    'country' => $item['venue']['location']['country'],
                    'address' => $item['venue']['location']['address'],
                    'rating' => $item['venue']['rating'],
                    'website' => $item['venue']['url'],
                ]);
            }
        }
0
Stephan-v 6 Янв 2016 в 15:21

5 ответов

Лучший ответ

Используйте самый простой способ, например:

foreach($items['response']['groups'] as $item1) {
            foreach($item1['items'] as $item) {
                Bar::firstOrCreate([
                    'lat' => isset($item['venue']['location']['lat'])?$item['venue']['location']['lat'] : '',
                    'long' => isset($item['venue']['location']['lng'])?$item['venue']['location']['lng'] : '',
                    'postalCode' => isset($item['venue']['location']['postalCode'])?$item['venue']['location']['postalCode'] : '',
                    'city' => isset($item['venue']['location']['city'])?$item['venue']['location']['city'] : '',
                    'state' => isset($item['venue']['location']['state'])?$item['venue']['location']['state'] : '',
                    'country' => isset($item['venue']['location']['country'])?item['venue']['location']['country'] : '',
                    'address' => isset($item['venue']['location']['address'])?$item['venue']['location']['address'] : '',
                    'rating' => isset($item['venue']['rating'])?$item['venue']['rating'] : '',
                    'website' => isset($item['venue']['url'])?$item['venue']['url'] : '',
                ]);
            }
        }
1
Ishan Shah 6 Янв 2016 в 12:45

Вам нужно будет где-нибудь проверить наличие индекса! Если вы не хотите делать это в контроллере, у вас может быть такая сущность, которая проверяет каждое поле:

<?php
class MyEntity 
{

    private $lat;
    private $long;
    private $postalcode;
    ...

    public static function createInstanceFromArray(array $item)
    {
        if (isset($item['lat']) {
            $this->setLat($item['lat']);
        }
        ... and so on

        // you could also do it automatic :
        foreach($item as $key => $value) {
            $methodName = 'set' . ucfirst($key);
            if (method_exists($this, $methodName)) {
                $this->{$methodName}($value);
            }
        }
    }

    public function setLat($lat) 
    {
        $this->lat = $lat;

        return $this;
    }

    public function getLat()
    {
        return $this->lat;
    }
}

Затем вы можете сделать со своим исходным кодом следующее:

foreach($items['response']['groups'] as $item) {
    foreach($item['items'] as $subItem) {
        $myEntity = MyNamespace\MyEntity::cretaInstanceFromArray($subItem['venue']);
    }
}

Затем вы можете установить поля своей сущности с помощью своих методов:

'lat' => $myEntity->getLat();
....

Таким образом, даже если поле массива не существует, сущность возвращает значение по умолчанию.

Если вы не хотите использовать объекты, вы можете использовать array_merge со значениями по умолчанию, чтобы убедиться, что у вас не будет индексов undefindex:

$item = array_merge([
    'lat' => '',
    'long' => '',
    'postalCode' => '',
    ...
], $item['venue']);

И поместите эту обработку в функцию для примера.

0
jiboulex 6 Янв 2016 в 12:45

Ваша проблема здесь в том, что вы перезаписываете значение $item на каждой итерации.

foreach($items['response']['groups'] as $item) {
    foreach($item['items'] as $item) {
        // after first iteration here `$item` doesn't have `items` key
    }

Используйте разные переменные в каждом foreach.

0
u_mulder 6 Янв 2016 в 12:28

Проверяйте каждый массив на полноту и только Bar::firstOrCreate(), если он действительно полон:

foreach($items['response']['groups'] as $item) {

 foreach($item['items'] as $item) {
        if(
            isset($item['venue']) &&
            isset($item['venue']['location']) &&
            isset($item['venue']['location']['lat']) &&
            isset($item['venue']['location']['lng']) &&
            isset($item['venue']['location']['postalCode']) &&
            isset($item['venue']['location']['city']) &&
            isset($item['venue']['location']['state']) &&
            isset($item['venue']['location']['country']) &&
            isset($item['venue']['location']['address']) &&
            isset($item['venue']['location']['lng']) &&
            isset($item['venue']['rating']) &&
            isset($item['venue']['url'])
        )
    Bar::firstOrCreate([
        'lat' => $item['venue']['location']['lat'],
        'long' => $item['venue']['location']['lng'],
        'postalCode' => $item['venue']['location']['postalCode'],
        'city' => $item['venue']['location']['city'],
        'state' => $item['venue']['location']['state'],
        'country' => $item['venue']['location']['country'],
        'address' => $item['venue']['location']['address'],
        'rating' => $item['venue']['rating'],
        'website' => $item['venue']['url'],
    ]);
  }
}
0
maxhb 6 Янв 2016 в 12:31

Вы можете использовать эти простые шаги

  1. удалите все ключи из вложенных массивов, которые не содержат значения, затем
  2. удалите все пустые вложенные массивы.

    $ yourArray = array_map ('array_filter', $ yourArray);

    $ yourArray = array_filter ($ yourArray);

0
shubham715 6 Янв 2016 в 12:32