PHP:未定义偏移量:0,但不是用dd()

4

在Laravel中,我遇到了Undefined offset: 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"
  }
]

我正在使用docker-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 ]);
}

完整的错误信息是什么?Undefined offset: 0 是与 $ports 还是 $data 相关的? - kerrin
1
这与$ports有关。我尝试使用foreach遍历$ports以获取值并将它们放入数组中。这确实有效,并适用于我的情况。但我仍然想知道为什么会发生这种情况。 - Odyssee
@GiacomoMasseroniChiaro 是的,它产生了相同的错误。 - Odyssee
如果您执行 $ports = array_shift($ports);,您会得到什么? - aaron0207
@aaron0207 这真的有效。 - Odyssee
显示剩余3条评论
1个回答

0
这是因为你的其中一个容器没有端口。使用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()提示。我将在几周后再次开始这个项目。如果我能再次测试它,我会更新这个线程。 - Odyssee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接