为什么变量在PHP对象数组中不变?

为什么变量在PHP对象数组中不变?,php,arrays,object,Php,Arrays,Object,我正在尝试用PHP汇编一个对象的数组(我对该语言不熟悉)。问题是我无法在我试图编写的foreach循环中的$bandwidthData数组中存储数据 private function _getData($startDay, $totalDays) { $devices = ubntDevices::getDevices(); $data = []; $bandwidthData = []; $count = 0; foreach ($devices as

我正在尝试用PHP汇编一个对象的
数组
(我对该语言不熟悉)。问题是我无法在我试图编写的
foreach
循环中的
$bandwidthData
数组中存储数据

private function _getData($startDay, $totalDays)
{
    $devices = ubntDevices::getDevices();
    $data = [];
    $bandwidthData = [];
    $count = 0;

    foreach ($devices as $device) {
        $bandwidthData[$count]['device'] = $device;
        $bandwidthData[$count]['bandwidth'] = new ubntModel($device->file);
        $bandwidthData[$count]['bandwidth']->getMonthData();
        $bandwidthData[$count]['tree'] = new graphTree($device->hostid);
        $bandwidthData[$count]['graphid'] = ubntGraph::getGraphByHostId($device->hostid);
        $bandwidthData[$count]['hostname'] = $device->host_name;
        $count++;
    }
    return $bandwidthData;
}

如果我从
foreach
循环中返回,我会得到正确的输出(但显然只针对第一个设备)。我已经测试了所有其他
函数
源代码,它们似乎返回了正确的数据。知道我做错了什么吗?提前感谢您。

您的PHP错误日志应该指出出现了什么问题。XDebug也非常推荐。
但是,现在更常见的是使用如下关联数组:

private function _getData($startDay, $totalDays)
{
    $devices = ubntDevices::getDevices();
    $bandwidthData = [];

    foreach ($devices as $device) {
        $ubntModel = new ubntModel($device->file);
        $deviceData = array('device' => $device,
                            'ubntModel' => $ubntModel,
                            'bandwidth' => $ubntModel->getMonthData(),
                            'tree' => new graphTree($device->hostid),
                            'graphid' => ubntGraph::getGraphByHostId($device->hostid),
                            'hostname' => $device->host_name);
        $bandwidthData[] = $deviceData;
    }
    return $bandwidthData;
}

我看到的一些事情:

这个变量正在使用吗

$data = [];
此外,此分配会运行,但不鼓励使用此方法,因为此时,
$bandwidthData[$count]
不存在:1

可转换为:

$bandwidthData[$count] = [ 'device' => $device ];
而且,这只是一个无功而返的人。不是吗

$bandwidthData[$count]['bandwidth']->getMonthData();
此外,为了进一步学习PHP,我可以为代码片段推荐这种更干净的方法,只是为了提高可读性:

private function _getData( $startDay, $totalDays ) {
    $bandwidthData = [];

    foreach ( ubntDevices::getDevices() as $device ) {
        $bandwidthData[] = [
            'device'    => $device,
            'bandwidth' => new ubntModel( $device->file ),
            'tree'      => new graphTree( $device->hostid ),
            'graphid'   => ubntGraph::getGraphByHostId( $device->hostid ),
            'hostname'  => $device->host_name,
        ];
    }

    return $bandwidthData;
}
无论如何,您必须学习如何调试这一简单的代码块,只需查看服务器日志,或者在可疑行中使用惰性
var\u转储($bandwidthData[$count])
(不要为这种调试方法而争论:它非常愚蠢,但是非常简单有效,而且对新手来说非常友好——如果你没有可能设置调试器,因为服务器可能不是你的等等)或者设置调试器


1来自

如果$arr还不存在,则会创建它,因此这也是创建数组的另一种方法。但是不鼓励这种做法,因为如果$arr已经包含一些值(例如,请求变量中的字符串),则该值将保留在原地并[]实际上可能代表字符串访问运算符。最好通过直接赋值来初始化变量


是否启用了PHP错误?可能是
new
关键字返回一个假对象,从而导致“在布尔值上执行对象某物或其他”,并导致一个空数组。这一直是我对使用PHP最大的不满,我似乎无法轻松调试它。有没有一种方法可以更轻松地使用VS代码查看错误?不确定是否使用VS代码,但可用于逐步调试:)现实生活中发送tbhopen一个终端并键入tail-f/apth/to/PHP/error\u log,如果($count==1)中断,您的错误将实时滚动过去尝试插入
在foreach块中从上到下逐渐进行。检查您的返回。
此外,此分配不正确,因为此时$bandwidthData[$count]不存在:
-不正确,它仍将分配它(除非
$count
出现错误):
$bandwidthData[$count]['bandwidth']->getMonthData()-你的理论/想法是什么?帮助调试的工具总是值得拥有的,特别是对于循环工作(或者至少我喜欢它,因为我可以看到数据在一步一步地处理)(lol,你用FUK生成了一个简短的URL)无论如何,也许我用错误的方式解释了我自己。它运行,它不发出任何警告,但它的官方劝阻。我已经用参考更新了评论。我更喜欢这个设置。我可能会用这种方式重构它,使它更干净。谢谢你的提示。仍在尝试安装xdebug。听起来好像每个使用PHP的人都在使用它。是的,XDebug的设置已经简化了很多。他们的网站可以建议正确的版本,创建安装程序等。还有其他用于性能优化的PHP调试器和分析器,例如XHProf。
private function _getData( $startDay, $totalDays ) {
    $bandwidthData = [];

    foreach ( ubntDevices::getDevices() as $device ) {
        $bandwidthData[] = [
            'device'    => $device,
            'bandwidth' => new ubntModel( $device->file ),
            'tree'      => new graphTree( $device->hostid ),
            'graphid'   => ubntGraph::getGraphByHostId( $device->hostid ),
            'hostname'  => $device->host_name,
        ];
    }

    return $bandwidthData;
}