我是php和Yii的新手,需要一些关于在网页中显示数组的帮助。
在控制器中,我打开我的电子邮件收件箱并遍历收件箱中的电子邮件并构建阵列,每个电子邮件地址都是具有值的键
if (array_key_exists($fromemail,$senders))
{ $senders[$fromemail]['rcount']++; }
else {
$senders[$fromemail]['e-mail'] = $fromemail;
$senders[$fromemail]['Name'] = $fromname;
$senders[$fromemail]['rcount'] = 1;
}
$model->top_senders = $senders;
$this->render('Step2',array('model'=>$model,));
然后在Step2的视图文件中,我想在CGridview中显示数据
if (isset($model->top_senders))
{
$gridDataProvider = new CArrayDataProvider($model->top_senders);
$gridDataProvider->setData($model->top_senders);
$gridColumns = array(
array('name'=>'e-mail', 'header'=>'E-mail','value' =>'$data->e-mail'),
array('name'=>'rcount', 'header'=>'# of mails','value'=>'$data->rcount'),);
$this->widget('bootstrap.widgets.TbGridView',array('dataProvider' => $gridDataProvider,'template' => "{items}",'columns'=>$gridColumns));
}
但是在呈现表格时我会收到错误: PHP通知未定义的偏移量:0
/**
125 * Renders a data cell.
126 * @param integer $row the row number (zero-based)
127 */
128 public function renderDataCell($row)
129 {
130 $data=$this->grid->dataProvider->data[$row];
我做错了什么?任何人都可以帮助我吗?
答案 0 :(得分:0)
您不应该按如下方式向提供者添加数据:
$gridDataProvider->setData($model->top_senders);
它在初始化期间添加。您必须确保该数组具有键id
,否则您需要手动指定它(它必须是唯一的),如下所示:
$gridDataProvider = new CArrayDataProvider($model->top_senders, array(
'id'=>'Name',
));
您还需要确保数组$model->top_senders
具有以下结构:
array(
'0'=>array(...user data here),
'1'=>array(...user data here),
...
);
答案 1 :(得分:0)
如果你var_dump($gridDataProvider->data)
,你会注意到数组中第0个索引没有值。当您在阵列上运行某个过滤器函数时会发生这种情况。假设过滤后的数组中有5个值,那么在var_dump
' d时,过滤后的数组看起来就像这样。
array(5) {
[1] => Object (Mailer) {…},
[2] => Object (Mailer) {…},
[4] => Object (Mailer) {…},
[8] => Object (Mailer) {…},
[9] => Object (Mailer) {…},
}
对数组进行过滤操作可以使数组看起来像上面那样。
当CGridView尝试用数据提供视图时,它按顺序执行 - 我发现,这是Yii中的一个缺点,应该引发问题。
为了解决这个问题,请使用PHP's array_values()
,如此......
$properly_indexed_array = array_values($filtered_array);
这会将已过滤数组的值复制到新数组中。就内存而言,这不是最佳解决方案。到目前为止,除了这一点,我在PHP中看不到任何其他方法。
然后您可以继续将其设置为数据提供者的数据,如此......
$gridDataProvider->setData($properly_indexed_array);