2014-11-15 5 views
1

Мне нужно поместить текст в массив на основе содержимого в массиве. НапримерРазместить текст абсолютно без перекрытия

<?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 будет спускаться только с волосами, чтобы они не перекрывались.

+0

Что означает «только волосы выше» в программировании? Вам нужно знать размер шрифта, размер строки, а затем это просто математика ... Я несколько сомневаюсь, что для вас есть библиотека для домыслов. – walther

ответ

0

ли что-то вроде этого:

$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>"; 
} 

Проверяется расстояние со всеми предыдущими значениями.

+1

Спасибо Hassan - это фактически изменяет $ stuff [$ i], что я не хочу делать, но я думаю, что я буду кодировать некоторую логику, как это, на месте –

0

Вы можете использовать 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>"; 

?> 

Update:

Это должно работать для вас:

<?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>"; 

?> 
+0

Спасибо Rizer - относительный отлично работает для неперекрывающихся , но я не получаю нужное место размещения - в частности, я помещаю 2 столбца бок о бок, и, если возможно, я хочу, чтобы один и тот же номер отображался в том же месте в двух столбцах. Если один массив содержит 5,10,15,20,50, а другой содержит 10,50, то 50 в 1-м столбце будут опускаться на дополнительные 4 позиции из-за относительного тега. –

+0

@NevilleAga обновил мой ответ, чтобы он был абсолютным, у вас может быть 2 столбца! Также я проверю, что мин. разница между числом равна 15, если не im добавить 10 к значению – Rizier123

+0

@NevilleAga Это сработало для вас? – Rizier123

0

Так что я в конечном итоге, используя время цикла и приращение смещения пока пространство больше не занято.

$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>"; 
} 
Смежные вопросы