Доброе утро. Столкнулся со следующей проблемой.
Есть проект, код которого написан на Perl. Поддерживал его долгое время, но вот настала беда - поддержка упирается в ресурсы системы.
Человек, который писал этот код, не на связи.
Суть следующая, есть
sub treecom{} которая выводит комментарии. Рекурсионно. Но запросы к БД - в каждой итерации.
На php написать могу и исправить - но как внедрить код - непонятно, поэтому нужна следующая помощь.
Нужен костяк функции, которая на пхп выглядела бы ~ так:
function getcomments($id){
$tree = array();
$comments = Db::getCommentsByArticle($id);
foreach ($comments as $row){
$tree[$row->parent][] = $row;
}
return getTreeComments($tree, 0);
}
function getTreeComments($tree, $parent){
$html = '';
if (isset($tree[$iter])){
$html .= $row->comment;
if (isset($tree[$row->id])){
$html .= getTreeComments($tree, $row->id);
}
return $html;
}
Сам код на Perl
sub treecom {
( my $przd, my $y, my $allend ) = @_;
$cntr++;
if ( $cntr > 200 ) { print qq[<b>Зацикливание!!</b><br><hr>$bb]; exit; }
$y++;
$selectp = "SELECT * FROM table WHERE key = value ORDER BY date ASC, id ASC
";
my $sp = $dbh->prepare($selectp);
$sp->execute;
while (
( $arid, $namek, $titlek, $textk, $date, $end, $usr_id, $rait, $pub, $usr_name, $status, $src ) =
$sp->fetchrow_array )
{
undef $img;
if ($src) {
$img = qq[<img src="/blog/users/$usr_id/profile.$src" width="30px" align="left" hspace="5" />];
}
if ( $pub eq "0" && $status < 1 ) { next; }
$date =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d:\d\d:\d\d)/;
$dates = qq[$3.$2.$1];
$time = $4;
@tm = split( ':', $time );
$time = qq[$tm[0]:$tm[1]];
$plft = ( $y * 10 ) . "px";
if ( !$usr_name ) { $namek = qq[<font class="nicname">$namek</font>]; }
else {
$namek = qq[<div style="width: 50%; float: left;">$img<a href="/reader/$usr_id/" class="nicnamea"><b>$usr_name</b></a> <font class="gryl">$usr_cnt</font></div>];
}
$bb .= qq[<tr><td style="padding: 0 0 10px $plft"><a name="cmt$arid"></a>$namek
<div style="clear: both;"></div>
<div>$textk</div>
];
if ( $end eq "1" && ( $allend eq 0 || $allend >= $y ) ) {
$allend = $y;
}
if ( $allend > $y || $allend eq "0" ) {
$otv = qq[<a href="/cgi-bin/comment.pl?article=$article&trs=table&parcom=$arid#cform" class="icomm" onclick="atcomm('$arid','table');">[ответить на комментарий]</a>];
}
$bb .= qq[<div style="float: left;">$otv</div><div style="float: right;"><font class="gryl">$dates $time</font></div></td></tr>];
undef $otv;
$par =
$dbh->selectrow_array("SELECT id FROM table where parent='$arid'");
if ($par) { treecom( $arid, $y, $allend ); }
if ( $y eq $allend ) { $allend = 0; }
}
$sp->finish;
}