2017-10-10 55 views
4

我得到一个Undefined offset: 0与laravel错误。奇怪的是,当我dd()它,它出现了。PHP:未定义偏移量:0,但不与dd()

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

这将返回Undefined offset: 0

当我dd()

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

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

全阵列:

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

我收到此错误与泊坞窗的PHP SDK。任何人都知道发生了什么?

全码:

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

什么是完整的错误消息? Undefined offset:0是否与$ ports或$ data有关? – kerrin

+1

它与$ ports有关。我尝试了一个$端口的foreach来获取值并将它们放入一个数组中。这确实有效,并适合我的情况。但我仍然想知道为什么会发生这种情况。你试过 –

+0

$ port = $ ports [0];? –

回答

0

这是因为你container的一个没有ports是用laravel collect()方法,让您的数组集合对象很好的做法,那么你可以使用可用的收集方法。 尝试下面的代码...

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

我发布这个问题已经很长时间了。如果我确实记得,在这种情况下无法使用端口的容器是不可能的。感谢'collect()'提示。我将在几周内再次开展这个项目。如果我可以再次测试,我会保持这个线程更新。 –