Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

array_keys() expects parameter 1 to be array, null given

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Quando tento desmarcar TODOS os checkboxes e clico em salvar, aparece o seguinte erro:

array_keys() expects parameter 1 to be array, null given

Ou seja, eu sou obrigado a deixar pelo menos 1 checkbox marcado para que a aplicação funcione corretamente. Se eu quiser zerar a contagem de episódios assistidos eu não consigo. Como posso contornar essa situação?

Abaixo está o código referente ao erro do array_keys() no EpisodiosController.php

<?php

namespace App\Http\Controllers;

use App\Models\Episodio;
use App\Models\Temporada;
use Illuminate\Http\Request;

class EpisodiosController extends Controller
{
    public function index(Temporada $temporada, Request $request)
    {
        $episodios = $temporada->episodios;
        $temporadaId = $temporada->id;
        $mensagem = $request->session()->get('mensagem');

        return view('episodios.index', compact('episodios', 'temporadaId', 'mensagem'));
    }

    public function assistir(Temporada $temporada, Request $request)
    {
        $idsEpisodiosAssistidos = array_keys($request->episodio);

        $temporada->episodios->each(function (Episodio $episodio) use ($idsEpisodiosAssistidos) {
            $episodio->assistido = in_array($episodio->id, $idsEpisodiosAssistidos);
        });

        $temporada->push();
        $request->session()->flash('mensagem', 'Episódios marcados com sucesso!');

        return redirect()->back();
    }
}
8 respostas

Bom dia Alef

Este erro está ocorrendo porque você está passando $request->episodio para a função array_keys(). No entanto o primeiro parâmetro desta função espera um array, por isso o erro: array_keys() expects parameter 1 to be array, null given.

O que pode está acontecendo é que no seu $request, não está chegando um array de fato.

O que eu recomendo neste caso é fazer uma tratativa antes, caso o valor da request não seja um array:

Um exemplo:

if(! is_array($request->episodio)) { ... }

Bem, espero que possa ajuda-lo em algo. Forte abraço!

Diego,

Eu não acredito que isso seja o problema do erro, de não estar indo um array de fato, conforme você comentou...

Acredito que o problema que está dando, é por conta de ser um dado vazio quando eu desmarco todos os checkboxes

array_keys() expects parameter 1 to be array, null given TRADUÇÃO: array_keys() espera que o parâmetro 1 seja array, dado nulo

A função array_keys() você é obrigado a passar um valor, quando eu desmarco todos os checkboxes, fica sem valor nenhum (NULL)

Ou seja, não tem nada para a $request receber

Boa tarde Alef,

Entendo.

Se neste caso, não está chegando nada em sua $request, então o problema não está ai, e sim como você manda esse dado.

Rode um dd($request->episodio) e vê o que está chegando ai.

Mas como mencionei no comentário anterior, você pode validar pra esta situação, de quando vem um valor nulo você fazer uma tratativa e a partir disso.

Diego,

Vale lembrar que eu segui a implementação exatamente igual o instrutor do curso fez, e esse erro talvez passou despercebido

Eu tentei fazer de várias maneiras e não estou conseguindo, inclusive a maneira que você explicou.

Sobre rodar um dd(), não adianta eu tentar achar algo nisso porque eu já sei que quando desmarco todos os checkboxes, fica sem dado nenhum na $request, pois é justamente o motivo do erro no array_keys()

Só que mesmo fazendo uma condição, ta persistindo o erro

Alef,

Entendi, teria como você postar a parte relativa ao frontend, para vê como está?

Porque pelo que estou entendo, o problema está sendo na hora que você envia esses dados.

 @extends('layouts.layout') 

 @section('titulo-aba', 'Episódios') 

 @section('titulo-cabecalho') 
     Episódios da temporada {{ $temporadaId }} 
 @endsection 

 @section('conteudo') 
     @include('mensagem', ['mensagem' => $mensagem]) 

     <form action="/temporadas/{{ $temporadaId }}/episodios/assistir" method="post"> 
         @csrf 
         <ul class="list-group"> 
             @foreach ($episodios as $episodio) 
             <li class="list-group-item d-flex justify-content-between align-items-center"> 
                 Episódio {{ $episodio->numero_episodio }} 
                 <input type="checkbox" name="episodio[{{ $episodio->id }}][assistido]" 
                     {{ $episodio->assistido ? 'checked' : '' }} 
                 > 
             </li> 
             @endforeach 
         </ul> 

         <button class="btn btn-primary mt-2 mb-5">Salvar</button> 
     </form> 
 @endsection

Amigo da uma olhada, deixei a linha que resolve seu problema marcada (**).

public function assistidos(Temporada $temporada, Request $request)
    {
        $assistidos = $request->episodio;

        $temporada->episodios->each(
            function (Episodio $episodio)
            use ($assistidos) {
                $episodio->assistido = ($assistidos) ? in_array($episodio->id, $assistidos) : false; // **Caso o usuário envie o formulário sem episódio marcado o sistema deve marcar todos como false 
            }
        );
        $temporada->push(); // Envia todas as alterações ocorridas;
        $request->session()->flash('mensagem',"Dados alterado com sucesso");
        return redirect()->back();
    }
solução!

Unicesumar Inteligência,

Antes de você responder esse tópico com a sua implementação, eu havia feito de outra forma...

Copiei o seu trecho de código só para testar, porém os checkboxes não aparecem marcados em minha tela... o alerta de sucesso aparece normalmente, mas sem as opções que deixei marcado, portanto acredito de deva ter outros arquivos PHP no seu projeto que estão diferentes do meu, e por isso está causando esses problemas

A forma que eu implementei e deu certo foi da seguinte maneira:

public function assistir(Temporada $temporada, Request $request)
    {
        if ($request->has('episodio')) {
            $idsEpisodiosAssistidos = array_keys($request->episodio);
        } else {
            $idsEpisodiosAssistidos = [];
        }

        $temporada->episodios->each(function (Episodio $episodio) use ($idsEpisodiosAssistidos) {
            $episodio->assistido = in_array($episodio->id, $idsEpisodiosAssistidos);
        });

        $temporada->push();
        $request->session()->flash('mensagem', 'Episódios marcados com sucesso!');

        return redirect()->back();
    }

Resumindo o que eu implementei:

Fiz apenas um if-else testando que se houver um campo na $request chamado episodio, então ele vai fazer o uso do array_keys($request->episodio); guardando na variável $idsEpisodiosAssistidos

Caso não exista o campo episodio na $request, que seria o caso de limpar todos os checkboxes, então ele manda um array vazio para variável $idsEpisodiosAssistidos = [];

Ou seja, em ambos os casos, a variável $idsEpisodiosAssistidos será usada sendo ela preenchida com dados da $request ou vazia...

Vou marcar esse tópico como resolvido, pois acredito que todos os problemas foram solucionados

Obrigado pela ajuda pessoal !!!