我正在尝试解决未定义的偏移量。我是谷歌并查看了堆栈溢出,但我发现的示例要么不适用,要么对我此技能的人来说太复杂了。我非常环保,但在寻求帮助和智慧之前,我已经做了很多努力。
这是现在存在的功能:
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设计的数字,它将显示任何打开的槽作为未定义的偏移错误(我希望我正确地说)。
答案 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>';
}
希望这有效