2017-10-10 2 views
4

Je reçois une erreur Undefined offset: 0 avec laravel. La chose étrange est que quand je dd() il, il apparaît.PHP: Offset non défini: 0, mais pas avec dd()

$ports = $container->getPorts(); 
    $ports = $ports[0]; 

Ce retour Undefined offset: 0

Quand je dd()

$ports = $container->getPorts(); 
dd($ports[0]); 

Port {#336 
    #privatePort: 80 
    #publicPort: 32780 
    #type: "tcp" 
} 

La gamme complète:

array:1 [▼ 
    0 => Port {#336 ▼ 
    #privatePort: 80 
    #publicPort: 32780 
    #type: "tcp" 
    } 
] 

Je reçois cette erreur avec le sdk docker-php. Quelqu'un qui a la moindre idée de ce qui se passe?

code complet:

public function dockerContainers() 
{ 
    $docker = new \Docker\Docker(); 
    $containerManager = $docker->getContainerManager(); 
    $containers = $containerManager->findAll(); 

    $data = []; 
    $x=0; 
    foreach ($containers as $container) { 
     $ports = $container->getPorts(); 
     // dd($ports[0]); 
     $ports = $ports[0]; 
     $privatePort = $ports->getPrivatePort(); 
     $publicPort = $ports->getPublicPort(); 
     $data[$x++] = [ 
      'id' => $container->getId(), 
      'state' => $container->getState(), 
      'names' => $container->getNames(), 
      'image' => $container->getImage(), 
      'status' => $container->getStatus(), 
      'ports' => [ 
       'privatePort' => $privatePort, 
       'publicPort' => $publicPort 
      ] 
     ]; 
    } 

    return view('containers', [ 'containers' => $data ]); 
} 
+0

Quel est le message d'erreur complet? Est-ce que le décalage non défini: 0 est lié à $ ports ou $ data? – kerrin

+1

Il est lié à $ ports. J'ai essayé un foreach sur $ ports pour obtenir les valeurs et les mettre dans un tableau. Cela fonctionne et convient à mon cas. Mais je me demande encore pourquoi cela arrive. –

+0

avez-vous essayé $ port = $ ports [0] ;? –

Répondre

0

C'est parce que l'un de vos container n'a pas ports il est bon d'utiliser la méthode Laravel collect() qui rend votre choix en objet de collection et vous pouvez utiliser les méthodes de collecte disponibles. Essayez le code suivant ...

foreach ($containers as $container) { 
      //getting ports and making laravel collection object 
     $ports = collect($container->getPorts()); 
     if($ports->first()){ 
     $ports = $ports->first(); 
     $privatePort = $ports->getPrivatePort(); 
     $publicPort = $ports->getPublicPort(); 
     $data[$x++] = [ 
      'id' => $container->getId(), 
      'state' => $container->getState(), 
      'names' => $container->getNames(), 
      'image' => $container->getImage(), 
      'status' => $container->getStatus(), 
      'ports' => [ 
       'privatePort' => $privatePort, 
       'publicPort' => $publicPort 
      ] 
     ]; 
    } 
} 
+1

Cela fait longtemps que j'ai posté cette question. Si je me souviens bien, un conteneur sans ports est impossible dans ce cas. Merci pour la pointe 'collect()'. Je vais retravailler sur ce projet dans quelques semaines. Je garderai ce sujet à jour si je peux le tester à nouveau. –