我需要根据数组中的内容将文本放置在数组中。例如
<?php $stuff = array (5, 15, 50, 55, 90);
for ($i=0; $i<5; $i++) {
echo "<div style=position:absolute; top:$i"."px> $stuff[$i] </div>";
}
将输出
5
15
50
55
90
这就是我想要的,但是问题是数组中的元素可能靠近在一起,例如 51 而不是 55:
$stuff = array (5,15,50,51,90);
这将输出
5
15
overlapping 50
and 51 here
90
由于文本的字体大小大于单个像素。
有没有办法将元素定位在靠近其自然位置而不会重叠的地方——在示例中,50 只会上升一根头发,51 只会下降一根头发,这样它们就不会重叠。
做这样的事情:
$stuff = array (5, 15, 50, 55, 90);
$limit = 5;
for ($i=0; $i < 5; $i++) {
for($j=0; $j < $i; $j++) {
if (abs($stuff[$j] - $stuff[$i]) <= $limit) $stuff[$i] += $limit;
}
echo "<div style=position:absolute; top:" . $i . "px> " . $stuff[$i] . " </div>";
}
这将使用所有先前的值检查距离。
你可以像这样使用position: relative
:
<?php
$stuff = array (5, 15, 50, 51, 90);
foreach($stuff as $k => $v)
echo "<div style='position: relative; top:" . $v . "px;'>$stuff[$k]</div>";
?>
更新:
这应该适合您:
<?php
$stuff = array (5, 15, 50, 51, 90);
foreach($stuff as $k => $v)
echo "<div style='position: absolute; top:" . (($k >= 1) ? (($stuff[$k]-$stuff[$k-1] < 15) ? ($v+10) : "$v") : "$v") . "px;'>$stuff[$k]</div>";
$stuff = array (5, 15, 50, 55, 90);
foreach($stuff as $k => $v)
echo "<div style='position: absolute; top:" . (($k >= 1) ? (($stuff[$k]-$stuff[$k-1] < 15) ? ($v+10) : "$v") : "$v") . "px; left: 30px'>$stuff[$k]</div>";
?>
所以我最终使用 while 循环并递增偏移量,直到空间不再被占用。
$stuff = array (5, 15, 50, 51, 90);
$z = array ();
for ($i=0; $i<5; $i++) {
$offset=0;
while ( (in_array($stuff + $offset,$z)) || (in_array($stuff[1] + 1 + $offset,$z)) ) { #this place already taken - assumes the text needs 2 px to display - adjust your math for your needs (I needed 8)
$offset++;
}
$i = $i + $offset;
#mark the spots as taken
$z[] = $stuff + $offset;
$z[] = $stuff + 1 + $offset;
echo "<div style=position:absolute; top:$stuff[$i]"."px> $stuff[$i] </div>";
}