PHP expert |
|
Ik probeer een tijdbalk-tekenaar te maken. Ik bedoel een tijdbalk voor geschiedenis.
Ik doe het met GD. Ik wil dat er gebeurtenissen opkomen (met tekst), maar ze mogen niet door elkaar staan:
1567: gebeurtenis 1
1568: gebeurtenis 2
Die twee overlappen elkaar op de tijdbalk, omdat de kort na elkaar gebeuren. Ik wil dan dat gebeurtenis 2 naar beneden schuift.
dit is mijn code:
<?php
error_reporting(E_ALL);
include 'var_info.function.php';
$jaartallen = array(
array('jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1'),
array('jaartal' => 655, 'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 '),
array('jaartal' => 656, 'gebeurtenis' => 'gebeurtenis 3'),
);
$rijen = array();
$jaartalbreedte = 100;
$jaartallen = array_reverse($jaartallen);
$max = -1000000000;
$min = 1000000000;
$aantal = count($jaartallen);
for($i = 0; $i < $aantal; $i++)
{
$bbox = imagettfbbox(20, 0, 'verdana.ttf', $jaartallen[$i]['gebeurtenis']);
$jaartallen[$i]['breedte'] = $bbox[2] - $bbox[0];
$jaartallen[$i]['start'] = $jaartallen[$i]['jaartal'] * $jaartalbreedte;
$jaartallen[$i]['eind'] = $jaartallen[$i]['start'] + $jaartallen[$i]['breedte'];
if($jaartallen[$i]['start'] < $min)
{
$min = $jaartallen[$i]['start'];
}
if($jaartallen[$i]['eind'] > $max)
{
$max = $jaartallen[$i]['eind'];
}
}
for($i = 0; $i < $aantal; $i++)
{
$jaartallen[$i]['start'] -= $min;
$jaartallen[$i]['eind'] -= $min;
}
for($i = 0; $i < $aantal; $i++)
{
$goed = false;
$count = count($rijen);
if($count != 0)
{
for($j = 0; $j < $count; $j++)
{
if(!$goed)
{
$count2 = count($rijen[$j]);
for($k = 0; $k < $count2; $k++)
{
$goed2 = true;
if($jaartallen[$i]['gebeurtenis'] != $rijen[$j][$k]['gebeurtenis'])
{
if($jaartallen[$i]['start'] >= $rijen[$j][$k]['start'] && $jaartallen[$i]['eind'] <= $rijen[$j][$k]['eind'])
{
echo 'overlap: start1:', $jaartallen[$i]['start'], ' start2:', $rijen[$j][$k]['start'], ' <br />';
$goed2 = false;
}else
{
$rijen[$j][] = $jaartallen[$i];
//echo 'geen overlap: start1:', $jaartallen[$i]['start'], ' start2:', $rijen[$j][$k]['start'], ' <br />';
}
}
if($goed2 == true)
{
echo 'rij', $j, ' is goed<br />';
$goed = true;
}
}
}
}
if(!$goed)
{
echo 'nieuwe rij<br />';
$rijen[count($rijen)][0] = $jaartallen[$i];
}
}else
{
$rijen[0][] = $jaartallen[$i];
}
}
var_info($jaartallen);
var_info($rijen);
?>
<?php include 'var_info.function.php'; array('jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1'), array('jaartal' => 655, 'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 '), array('jaartal' => 656, 'gebeurtenis' => 'gebeurtenis 3'), ); $jaartalbreedte = 100; $max = -1000000000; $min = 1000000000; $aantal = count($jaartallen); for($i = 0; $i < $aantal; $i++) { $bbox = imagettfbbox(20, 0, 'verdana.ttf', $jaartallen[$i]['gebeurtenis']); $jaartallen[$i]['breedte'] = $bbox[2] - $bbox[0]; $jaartallen[$i]['start'] = $jaartallen[$i]['jaartal'] * $jaartalbreedte; $jaartallen[$i]['eind'] = $jaartallen[$i]['start'] + $jaartallen[$i]['breedte']; if($jaartallen[$i]['start'] < $min) { $min = $jaartallen[$i]['start']; } if($jaartallen[$i]['eind'] > $max) { $max = $jaartallen[$i]['eind']; } } for($i = 0; $i < $aantal; $i++) { $jaartallen[$i]['start'] -= $min; $jaartallen[$i]['eind'] -= $min; } for($i = 0; $i < $aantal; $i++) { $goed = false; if($count != 0) { for($j = 0; $j < $count; $j++) { if(!$goed) { $count2 = count($rijen[$j]); for($k = 0; $k < $count2; $k++) { $goed2 = true; if($jaartallen[$i]['gebeurtenis'] != $rijen[$j][$k]['gebeurtenis']) { if($jaartallen[$i]['start'] >= $rijen[$j][$k]['start'] && $jaartallen[$i]['eind'] <= $rijen[$j][$k]['eind']) { echo 'overlap: start1:', $jaartallen[$i]['start'], ' start2:', $rijen[$j][$k]['start'], ' <br />'; $goed2 = false; }else { $rijen[$j][] = $jaartallen[$i]; //echo 'geen overlap: start1:', $jaartallen[$i]['start'], ' start2:', $rijen[$j][$k]['start'], ' <br />'; } } if($goed2 == true) { echo 'rij', $j, ' is goed<br />'; $goed = true; } } } } if(!$goed) { $rijen[count($rijen)][0] = $jaartallen[$i]; } }else { $rijen[0][] = $jaartallen[$i]; } } var_info($jaartallen); var_info($rijen); ?>
nu krijg ik deze output:
rij0 is goed
rij0 is goed
rij0 is goed
<?php
array (
0 =>
array (
'jaartal' => 656,
'gebeurtenis' => 'gebeurtenis 3',
'breedte' => 174,
'start' => 89000,
'eind' => 89174,
),
1 =>
array (
'jaartal' => 655,
'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 ',
'breedte' => 1673,
'start' => 88900,
'eind' => 90573,
),
2 =>
array (
'jaartal' => -234,
'gebeurtenis' => 'gebeurtenis 1',
'breedte' => 174,
'start' => 0,
'eind' => 174,
),
)
?> <?php
array (
0 =>
array (
0 =>
array (
'jaartal' => 656,
'gebeurtenis' => 'gebeurtenis 3',
'breedte' => 174,
'start' => 89000,
'eind' => 89174,
),
1 =>
array (
'jaartal' => 655,
'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 ',
'breedte' => 1673,
'start' => 88900,
'eind' => 90573,
),
2 =>
array (
'jaartal' => -234,
'gebeurtenis' => 'gebeurtenis 1',
'breedte' => 174,
'start' => 0,
'eind' => 174,
),
3 =>
array (
'jaartal' => -234,
'gebeurtenis' => 'gebeurtenis 1',
'breedte' => 174,
'start' => 0,
'eind' => 174,
),
),
)
?>
rij0 is goed rij0 is goed rij0 is goed <?php 0 => 'jaartal' => 656, 'gebeurtenis' => 'gebeurtenis 3', 'breedte' => 174, 'start' => 89000, 'eind' => 89174, ), 1 => 'jaartal' => 655, 'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 ', 'breedte' => 1673, 'start' => 88900, 'eind' => 90573, ), 2 => 'jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1', 'breedte' => 174, 'start' => 0, 'eind' => 174, ), ) ?> <?php 0 => 0 => 'jaartal' => 656, 'gebeurtenis' => 'gebeurtenis 3', 'breedte' => 174, 'start' => 89000, 'eind' => 89174, ), 1 => 'jaartal' => 655, 'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 ', 'breedte' => 1673, 'start' => 88900, 'eind' => 90573, ), 2 => 'jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1', 'breedte' => 174, 'start' => 0, 'eind' => 174, ), 3 => 'jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1', 'breedte' => 174, 'start' => 0, 'eind' => 174, ), ), ) ?>
Nu staan ze dus allemaal naast elkaar, maar ze overlappen, dus ze moeten naar beneden.
array (
0 =>
array (
0 =>
array (
'jaartal' => 656,
'gebeurtenis' => 'gebeurtenis 3',
'breedte' => 174,
'start' => 89000,
'eind' => 89174,
),
1 =>
array (
'jaartal' => 655,
'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 ',
'breedte' => 1673,
'start' => 88900,
'eind' => 90573,
),
2 =>
array (
'jaartal' => -234,
'gebeurtenis' => 'gebeurtenis 1',
'breedte' => 174,
'start' => 0,
'eind' => 174,
),
3 =>
array (
'jaartal' => -234,
'gebeurtenis' => 'gebeurtenis 1',
'breedte' => 174,
'start' => 0,
'eind' => 174,
),
),
)
0 => 0 => 'jaartal' => 656, 'gebeurtenis' => 'gebeurtenis 3', 'breedte' => 174, 'start' => 89000, 'eind' => 89174, ), 1 => 'jaartal' => 655, 'gebeurtenis' => 'gebeurtenis 2 gebeurtenis 2 gebeurtenis 2tenis 2 gebeurtenis 2tenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 gebeurtenis 2 ', 'breedte' => 1673, 'start' => 88900, 'eind' => 90573, ), 2 => 'jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1', 'breedte' => 174, 'start' => 0, 'eind' => 174, ), 3 => 'jaartal' => -234, 'gebeurtenis' => 'gebeurtenis 1', 'breedte' => 174, 'start' => 0, 'eind' => 174, ), ), )
Dat is de array rijen, en daarin staat alles in rij 0, maar eigenlijk zou gebeurtenis 2 gebeurtenis 3 overlappen, dus gebeurtenis 3 moet naar beneden.
Weten jullie wat er fout is?
Alvast bedankt,
Jules
EDIT:
Ehh, dit is wel een ultralange post geworden
|