Неопределенное смещение 0: Laravel

#php #laravel

#php #laravel

Вопрос:

Я уже прочитал другие подобные вопросы по stackoverflow, и ни один из них не помог мне найти решение.

Это совершенно запутано, то, что когда-то работало, случайно сломалось, и я понятия не имею, что не так, ошибка не кажется мне логичной, я покажу вам, что я имею в виду.

 public function nGetOverviewAccounts()
    {
    $results = Account::where('archive', '=', false)->select('id', 'display_name', 'server_ip_address', 'server_password', 'status_type_id', 'account_type_id')->get()->toArray();

    $index = 0;
    $accounts = [];

    foreach($results as $result)
    {
        $accountType  = AccountType::where('id', $result['account_type_id'])->select('name')->get()->toArray();
        $statusType   = StatusType::where('id', $result['status_type_id'])->select('name')->get()->toArray();

        return $accountType[0]['name']; //this works

        $accounts[$index]['account_type'] = $accountType[0]['name']; //this doesnt..

        $accounts[$index]['status_type']  = $statusType[0]['name'];

        $index  ;
    }

    return $accounts;
}
  

Этот код находится рядом друг с другом в функции. Массив $accountType выглядит следующим образом.

 0:{name: "Google"}
  

Который показывает, что он имеет индекс 0, но он не работает.

РЕДАКТИРОВАТЬ: ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ

Я собираюсь кое-что прояснить, я, кажется, неправильно объяснил вам, ребята, оператор return добавлен мной ПОСЛЕ того, как я получаю ошибку undefined index, я только добавил его в код, чтобы показать, что он работает, когда я возвращаю его, но когда я пытаюсь присвоить его значение другой переменной (без оператора return) я получаю ошибку неопределенного индекса.

Комментарии:

1. Такова природа функции, обрабатывающей возвращаемое значение. Как только вы возвращаете значение, функция «останавливается» сама по себе, что означает, что каждый цикл или каждый код ПОСЛЕ первого возврата, с которым сталкивается функция, не будут выполняться. Вот почему у вас есть только 1 строка вместо n.

2. Почему вы [0] все равно используете. Похоже, что этот вызов в любом случае вернет только одну строку, поэтому используйте $accountType['name']

3. В любом случае, поскольку строка, о которой вы говорите, не работает, после a return она на самом деле никогда не будет выполнена

4. @RiggsFolly Я могу удалить оператор return из кода, и он выполнит следующую строку, вот как я получал ошибку в первую очередь. Возврат был введен для тестирования кода.

5. @kenzieeflavius используйте print_r() вместо return , чтобы увидеть значение.

Ответ №1:

Попробуйте это:

 public function nGetOverviewAccounts()
{
$results = Account::where('archive', '=', false)->select('id', 'display_name', 'server_ip_address', 'server_password', 'status_type_id', 'account_type_id')->get()->toArray();

$accounts = [];

foreach($results as $key => $result)
{
    $accountType  = AccountType::where('id', $result['account_type_id'])->select('name')->get()->toArray();
    $statusType   = StatusType::where('id', $result['status_type_id'])->select('name')->get()->toArray();

    if(!empty( $accountType[0]['name'])) amp;amp; !empty( $statusType[0]['name'])){
    $accounts[$key]['account_type'] = $accountType[0]['name']; //this doesnt..

    $accounts[$key]['status_type']  = $statusType[0]['name']; 
  }
}

return $accounts;
}
  

Также, если вам нужен первый ключ $accountType , а $statusType затем вы можете использовать first() вместо get() . Если ваши ключи отличаются, вы можете использовать $index

Комментарии:

1. Проблема не $results в его с $accountType[0]

2. В вашем foreach цикле, который вы использовали return $accountType[0]['name']; , и, следовательно, значение возвращается и никогда не помещается внутрь массива.

3. Вы меня неправильно поняли, я не пытаюсь увидеть, что в массиве, который я уже знаю, я использую return, чтобы посмотреть, выдаст ли он ошибку, но это не так. Когда я не использую оператор return, следующая строка ниже выдает ошибку, эта ошибка «неопределенный индекс 0», вот вопрос, извините, если он ошибся

4. @Kenzieeflavius Итак, в этом случае ваша $accountsType переменная возвращает значение null. Я обновляю код для этого.

5. Он не возвращает значение null, в моем вопросе это показывает, что когда я возвращаю переменную, она дает мне объект данных, который мне нужен, НО когда я назначаю его, он указывает неопределенное смещение

Ответ №2:

Добавление некоторых проверок никому не повредит:

 public function nGetOverviewAccounts() {
    $results = Account::where('archive', '=', false)->select('id', 'display_name', 'server_ip_address', 'server_password', 'status_type_id', 'account_type_id')->get()->toArray();

    $index = 0;
    $accounts = [];

    foreach($results as $result)
    {
        $accountType  = AccountType::where('id', $result['account_type_id'])->select('name')->get()->toArray();
        $statusType   = StatusType::where('id', $result['status_type_id'])->select('name')->get()->toArray();


        $accounts[$index]['account_type'] = (isset($accountType[0]) amp;amp; isset($accountType[0]['name'])?$accountType[0]['name']:"Unknown";

        $accounts[$index]['status_type']  = (isset($statusType[0]) amp;amp; isset($statusType[0]['name'])?$statusType[0]['name']:"Unknown";

        $index  ;
    }

    return $accounts;
}
  

Проблема в том, что ваш «отладочный» код проверяется только в том случае, если он работал для 1-й итерации цикла, возможно, он все еще не работал для N-го элемента.

Однако, если это решит вашу проблему, следующий вопрос: почему существуют учетные записи, связанные с недопустимыми идентификаторами типа учетной записи. Это может быть признаком более серьезной проблемы.

Комментарии:

1. Причина, по которой он был связан с недопустимыми идентификаторами, заключается в том, что исходный тип учетной записи был назначен нескольким учетным записям. Но он был удален из базы данных, но затем добавлен повторно, но с другим идентификатором. Поскольку он использует идентификатор для проверки и отображения данных, а не имя, оно выдавало ошибку, где, где вы 30 минут назад!