为什么变量在PHP对象数组中不变?
我正在尝试用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
数组
(我对该语言不熟悉)。问题是我无法在我试图编写的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;
}