Без да претендирам за оптималност или елегантност, моето решение:
Входящи данни:-----------------------
Array
(
[0] => Array
(
[opera_title] => Аида
[composers] => Верди, Джузепе; Verdi, Giuseppe
)
[1] => Array
(
[opera_title] => Симфоничен концерт
[composers] => Бетовен, Лудвиг ван; Стравински, Игор
)
[2] => Array
(
[opera_title] => Ноктюрно
[composers] => Лист, Ференц
)
[3] => Array
(
[opera_title] => Le Sacre du printemps
[composers] => Стравински, Игор
)
[4] => Array
(
[opera_title] => La Traviata
[composers] => Верди, Джузепе; Verdi, Giuseppe
)
[5] => Array
(
[opera_title] => Цвета
[composers] => Атанасов, Маестро Георги
)
)
-----------------------
Визуализация:<?php
include './inc/header.php';
echo '<section><article><header>';
echo '<h1>'.$title.'</h1></header>';
if(!isset($order)){
$order='ASC';
}
if (isset($_GET['o_order'])) {
/* сортираме имената на произведенията */
$order=$_GET['order'];
if(isset($_GET['col'])){
switch ($_GET['col']) {
case 1:
$data=sort_ot($data,$order);
break;
case 2:
$data=sort_c($data,$order);
break;
}
switch ($order) {
case 'ASC':
$order='DESC';
break;
case 'DESC':
$order='ASC';
break;
}
}
}
echo '<table>
<thead><tr>
<th><a href="index.php?page=operas&o_order=true&order='.$order.'&col=1">Произведение</a></th><th><a href="index.php?page=operas&o_order=true&order='.$order.'&col=2">Композитори</a></th>
</tr></thead><tbody>';
for ($i=0;$i<count($data);$i++) {
echo '<tr><td>';
// echo preg_match(">.+<",$opera_title[$i]);
echo $data[$i]['opera_title'].'</td><td>';
echo $data[$i]['composers']. '</td></tr>';
}
echo '</tbody></table>
</article></section>';
include './inc/footer.php';
Сортиране:function sort_ot ($data,$order) {
switch ($order) {
case 'ASC':
usort($data,'cmp_ot');
break;
case 'DESC':
usort($data,'cmp_otr');
break;
}
return $data;
}
function cmp_ot($a,$b) {
$x=substr($a['opera_title'],strpos($a['opera_title'],'>')+1, strrpos($a['opera_title'],'<',strpos($a['opera_title'],'>'))-strpos($a['opera_title'],'>')-1);
$y=substr($b['opera_title'],strpos($b['opera_title'],'>')+1, strrpos($b['opera_title'],'<',strpos($b['opera_title'],'>'))-strpos($b['opera_title'],'>')-1);
if ($x === $y) {
return 0;
} elseif ($x < $y) {
return -1;
} else {
return 1;
}
}
function cmp_otr($a,$b) {
$x=substr($a['opera_title'],strpos($a['opera_title'],'>')+1, strrpos($a['opera_title'],'<',strpos($a['opera_title'],'>'))-strpos($a['opera_title'],'>')-1);
$y=substr($b['opera_title'],strpos($b['opera_title'],'>')+1, strrpos($b['opera_title'],'<',strpos($b['opera_title'],'>'))-strpos($b['opera_title'],'>')-1);
if ($x === $y) {
return 0;
} elseif ($x > $y) {
return -1;
} else {
return 1;
}
}
function sort_c ($data,$order) {
switch ($order) {
case 'ASC':
usort($data,'cmp_c');
break;
case 'DESC':
usort($data,'cmp_cr');
break;
}
return $data;
}
function cmp_c($a,$b) {
$x=substr($a['composers'],strpos($a['composers'],'>')+1, strrpos($a['composers'],'<',strpos($a['composers'],'>'))-strpos($a['composers'],'>')-1);
$y=substr($b['composers'],strpos($b['composers'],'>')+1, strrpos($b['composers'],'<',strpos($b['composers'],'>'))-strpos($b['composers'],'>')-1);
if ($x === $y) {
return 0;
} elseif ($x < $y) {
return -1;
} else {
return 1;
}
}
function cmp_cr($a,$b) {
$x=substr($a['composers'],strpos($a['composers'],'>')+1, strrpos($a['composers'],'<',strpos($a['composers'],'>'))-strpos($a['composers'],'>')-1);
$y=substr($b['composers'],strpos($b['composers'],'>')+1, strrpos($b['composers'],'<',strpos($b['composers'],'>'))-strpos($b['composers'],'>')-1);
if ($x === $y) {
return 0;
} elseif ($x > $y) {
return -1;
} else {
return 1;
}
}
Допълнителен въпрос: какъв dump, print_r или нещо друго мога да ползвам, така че вместо „Цвета“ да ми излиза реалното „<a href="index.php?page=spectacles&opera_id=6">Цвета</a>“?