在循环通过一个阵列然后向前移动然后向前移动?

时间:2014-02-11 23:09:37

标签: php arrays gd

是的,所以过去几天我一直在为此而烦恼。

所以我有这三个字符串

$string_one = 'Some text';
$string_two = 'Some more text';
$string_three = 'Even more text';

通过imagettfbbox()来设置它们的高度和宽度。

我希望GD图像中的输出为Some text Some more text Even more text,所以基本上我希望它们都在一行上。所以我试图根据之前的字符串长度计算每个字符串的x位置,该字符串长度必须相对于$x位置。

目前,我正在尝试执行以下操作:

  1. 将两个(或更多)宽度加在一起
  2. 将总数除以2
  3. $x减去答案,这给出了第一个字符串的起点。
  4. 要设置第二个字符串起点,我将第一个字符串长度添加到起点。
  5. 但是为了做到这一点,我必须回到之前的值,获取宽度,将其添加到当前宽度并除以2,然后设置前一个和当前数组变量的值。

    所以每次while循环时,我想要移回数组指针,获取宽度值,确定x位置,然后向前移动数组指针并设置x位置。

    所以我尝试使用prev()next()来遍历数组。

    我正在做以下事情:

    设置

    $gb取决于for循环过去的字符串。因此,如果它是第二种情况,它会返回1,到第一种情况。如果它是第5,它会回到3,但这在这里并不重要。

    $o是在while循环结束时迭代的计数器,这两个for循环就在这里。

    $text是一个二维数组,如下所示:

    Array
    (
        [ven-pub] => Array
            (
                [value] => 
                [font-size] => 30
            )
    
        [More array values]....
    )
    

    但我的目标是在最后看起来像这样

    Array
    (
        [ven-pub] => Array
            (
                [value] => 
                [font-size] => 30
                [h] => 38
                [w] => 514
                [x] => 1514
                [y] => 1611
            )
    
        [More array values]....
    )
    

    我会在代码中评论我正在尝试做什么,但是假设这是循环遍历第二个数组变量。

    $gb = 1;//In this instance $gb is going back once.
    $o = 1;//Set the counter to one, because count will not include 0, right?
    $arr_c = count($text);//Set the maximum number of times we should loop.
    while($o <= $arr_c){//Meanwhile...
        $key = key($text);//Getting the current key
        $text[$key]['font-size'] = $text[$key]['font-size']*3;//Text related stuff
        //Getting the height and width of my string  
        $dimensions = imagettfbbox($text[$key]['font-size'], 0, $font, $text[$key]['value']);
        $text[$key]['h'] = ($dimensions[7]-$dimensions[1])*-1;//Setting the height...
        $text[$key]['w'] = ($dimensions[2]-$dimensions[0]);//...and width
    
        for($gb;$gb<=$o;$gb++){
            $key = key($text);//I've found getting the key again helps..
            /* Here I'm looping backward just once using prev()
               and adding the widths into one variable */
            $widths[] = $text[$key]['w'];
            prev($text);
        }
    
        $total_width = array_sum($widths);
        $x = ($new_x - ($total_width/2)); //Dividing it by two to get my start position.
        /*Setting the current $key's ['x'] position, which should be 
          the first array variable, not the second.*/  
        $text[$key]['x'] = $x;
    
    
        $gb = $cgb;//Resets $gb to its original number.
        $combined_widths[] = $text[$key]['w'];//Saving the starting width for the next array variable
    
        for($gb;$gb<=$o;$gb++){
            next($text);//Moving forwards to the next array variable.
            /* Adding the previous array variables width to $x to generate the
               second array variables ['x'] position.  
            */
            $text[$key]['x'] = $x+array_sum($combined_widths);
            $combined_widths[] = $text[$key]['w'];//Adding the new variables width to the previous          
    
        }
    //By here, the array pointer should be back where it started for this loop.
    
    next($text)//Move the array pointer forward ready for the next loop.
    $o++
    }
    

    我的问题出现在它开始要么回到远处,要么告诉我索引是未定义的。对此非常困惑。

1 个答案:

答案 0 :(得分:0)

好的,老实说,我不明白你的代码。它被打破了很多点,我无法马上解决它。另外,我真的不明白你想要达到的目标。请查看我根据您的代码创建的以下代码以及到目前为止我所理解的内容。也许我们可以找到更接近你想要实现的东西,或者只是不同的编码风格足以让你达到目标。

<?php

// Ensure we start from the beginning of the array.
reset($text);

// Helpers...
$widths = $next_x = 0;

foreach ($text as $key => $attributes) {
  $text[$key]["font-size"] *= 3;

  // Where is $font coming fromt?
  $dimensions  = imagettfbbox($text[$key]["font-size"], 0, $font, $text[$key]["value"]);

  $text[$key]["h"] = abs($dimensions[7] - $dimensions[1]);
  $text[$key]["w"] = $dimensions[2] - $dimensions[0];

  // Directly add it, we iterate forward, no need for your complicated and slow loop in a loop.
  $widths += $text[$key]["w"];

  // Where is $new_x coming from?
  $text[$key]["x"] = $next_x - $widths / 2;

  // All we wanted, isn't it.
  $next_x = $text[$key]["x"] + $text[$key]["w"];
}

?>

一般建议:总是尝试编写易于理解的代码。不要开始摆弄prev()next()或循环循环,除非它不是完全必要的(无论出于何种原因)。不要犹豫,引入中间变量来帮助您和其他人理解您的代码(相应地命名它们,这样每个人都知道他们在做什么而没有任何评论)。