函数返回未定义的偏移量错误

时间:2014-02-12 18:32:29

标签: php arrays function undefined offset

我正在尝试解决未定义的偏移量。我是谷歌并查看了堆栈溢出,但我发现的示例要么不适用,要么对我此技能的人来说太复杂了。我非常环保,但在寻求帮助和智慧之前,我已经做了很多努力。

这是现在存在的功能:

function PrintFolio($aaPh) //aaPh =associative array place holder

{
//print out X number rows of unto 4 images from array with X items
//if array had 7 items, print one row of 4 next row 3
//if array had 16 items, print 4 rows of 4, etc.
    //if array had 13 items, print 3 rows of 4, final row with one item

$itemsCount = sizeof($aaPh);//get size of array

$height = (int)ceil(sizeof($aaPh)/4);//rounded up division by 4

//$height = $height + 1;
$keys = array_keys($aaPh); //get keys

//loop through array of X items, for each group of 4 print as a row
for($row = 0; $row < $height; $row++)    //looping through the rows

    {
        echo '<div class="row flush">'; //open div
        for($image = 0; $image < 4; $image++)    //each row is composed of 4 images
        {
             $aaPhIndex = array_keys($aaPh)[$row*4+$image]; //if associative array
             if( $row*4+$image < $itemsCount ) {
                 $aaPhIndex = $keys[$row*4+$image];
                 printf(TEMPLATE_PORTFOLIO, $aaPhIndex, $aaPh[$aaPhIndex]);
                 //$template = '<div class="3u"><a href="_img/fulls/%1$s" class="image full"><img src="_img/thumbs/%1$s" alt="" title="%2$s" /></a></div>';
            }
        }

        echo '</div>'; //end div group of 4
    }//end loop
}//end function

它需要一个数组,将其切成四个单位,然后将数组作为一系列图像打印到屏幕上。但是,如果我没有一个完全由4设计的数字,它将显示任何打开的槽作为未定义的偏移错误(我希望我正确地说)。

  • 我的目标是在没有修改我的网站错误报告功能的情况下不将未定义的偏移错误打印到这些屏幕(我认为这样做会因为不能纠正问题而作弊,只是隐藏它看起来不太好在我上面。)

3 个答案:

答案 0 :(得分:1)

由于您不能假设您总是会有一些可被4整除的元素,因此您需要对每个元素进行测试。在您计算索引的内部循环中,然后使用它来引用数组,只需添加一个检查以确保数组元素存在。由此:

$aaPhIndex = $keys[$row*4+$image];
printf(TEMPLATE_PORTFOLIO, $aaPhIndex, $aaPh[$aaPhIndex]);

对此:

$aaPhIndex = $keys[$row*4+$image];
if (isset($aaPh[$aaPhIndex])) {
    printf(TEMPLATE_PORTFOLIO, $aaPhIndex, $aaPh[$aaPhIndex]);
}

答案 1 :(得分:1)

为什么不在每个第4个元素之后放一个换行符?

function PrintFolio($aaPh) //aaPh =associative array place holder
{
//loop through the array
for($row = 0; $row < Count($aaPh); $row++)    //looping through the rows
{
    if (!$row || !($row%4)) {
        if ($row) echo '</div>'; // close previously opened divs
        echo '<div class="row flush">'; //open div
    }
    /* show your picture code here */

}//end loop
echo '</div>';
}//end function

以下是您的评论后的更新。 因为您不需要关联数组的值,只需要键,所以可以按如下方式更改代码:

function PrintFolio($aaPh) //aaPh =associative array place holder
{
//loop through the array
$row=0;
foreach(array_keys($aaPh) as $img)    //looping through array keys only
{
    if (!$row || !($row%4)) {
        if ($row) echo '</div>'; // close previously opened divs
        echo '<div class="row flush">'; //open div
    }
    echo '<img src="' . $img . '">';
    $row++; // increase row counter.
}//end loop
echo '</div>';
}//end function

确保将正确的路径放入标记

答案 2 :(得分:1)

你的逻辑中的错误是在这一行

for($image = 0; $image < 4; $image++)    //each row is composed of 4 images

您认为总有4张图片。但就像你自己说的那样,如果数组有13个项目,那么最后一行只包含一个图像。这将导致$aaPhIndex = array_keys($aaPh)[$row*4+$image];访问不存在的数组索引。

要解决此问题,您必须修改$image < 4以考虑最后一行,或者只检查索引是否超过项目数。例如,将错误行置于您已写入的条件下:

if( $row*4+$image < $itemsCount ) {
    $aaPhIndex = array_keys($aaPh)[$row*4+$image]; //if associative array
    $aaPhIndex = $keys[$row*4+$image];
    printf(TEMPLATE_PORTFOLIO, $aaPhIndex, $aaPh[$aaPhIndex]);
    //$template = '<div class="3u"><a href="_img/fulls/%1$s" class="image full"><img src="_img/thumbs/%1$s" alt="" title="%2$s" /></a></div>';
}

希望这有效