Сортировка строк в таблице (table) через PHP

Samail
На сайте с 10.05.2007
Offline
369
1175

Обычная таблица:


<table>
<tr ID="5">
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr ID="2">
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr ID="5">
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr ID="7">
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>

Можно ли в ней отсортировать строки по ID? (ID могут совпадать). Для JavaScript в интернете много решений, а для PHP, что-то не нашел.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

А в каком виде эта таблица представлена в php-коде? Просто в виде текстовой строки что-ли? Откуда данные для заполнения таблицы?

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Samail
На сайте с 10.05.2007
Offline
369
#2


<table width="900" border="0" align="left">
<?php foreach($cart as $k => $v2): ?>
<?php if(условие 1): ?>
<tr>
<td width="90">
<a href="/str=<?=$k;?>" target="_blank"><img src="<?=$v2['image'];?>" width="75" height="auto" /></a></td>
<td>
<a href="/str=<?=$k;?>" target="_blank"><strong><?=$res;?></strong><br/></a><?=$resType;?>
</td>
<td>***</td><td>***</td>
</tr>
<?php endif; ?>
<?php if(условие 2): ?>
<tr>
<td width="90">
<a href="/str=<?=$k;?>" target="_blank"><img src="<?=$v2['image'];?>" width="75" height="auto" /></a></td>
<td>
<a href="/str=<?=$k;?>" target="_blank"><strong><?=$res;?></strong><br/></a><?=$resType;?>
</td>
<td>***</td><td>***</td>
</tr>
<?php endif; ?>
<?php if(условие 3): ?>
<tr>
<td width="90">
<a href="/str=<?=$k;?>" target="_blank"><img src="<?=$v2['image'];?>" width="75" height="auto" /></a></td>
<td>
<a href="/str=<?=$k;?>" target="_blank"><strong><?=$res;?></strong><br/></a><?=$resType;?>
</td>
<td>***</td><td>***</td>
</tr>
<?php endif; ?>
<?php if(условие 4): ?>
<tr>
<td width="90">
<a href="/str=<?=$k;?>" target="_blank"><img src="<?=$v2['image'];?>" width="75" height="auto" /></a></td>
<td>
<a href="/str=<?=$k;?>" target="_blank"><strong><?=$res;?></strong><br/></a><?=$resType;?>
</td>
<td>***</td><td>***</td>
</tr>
<?php endif; ?>
<?php endforeach; ?>
</table>

Нужно что-бы строки отвечающие условиям группировались, а не перемешивались.

yozik13
На сайте с 03.11.2012
Offline
84
#3

Какой кошмар.

А я то думал что хуже меня говнокодеров не бывает.

Делайте отдельный цыкл foreach для каждого условия по порядку.

Алла Рудь
На сайте с 13.08.2014
Offline
81
#4

Samail, если правильно поняли задачу, то для php также много решений можно придумать. Например, использовать ksort (krsort). Это отсортирует по ключу. Если id могут быть одинаковые, используйте сортировку не ключей, а данных при помощи функций asort (arsort).

Пример использования:

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val) {
echo "$key = $val\n";
}
?>

Результат будет:

c = apple

b = banana

d = lemon

a = orange

arsort отсортирует масив в другуй сторону.

Надежный хостинг и VPS на SSD от профессионалов HyperHost (https://hyperhost.ua/)
Samail
На сайте с 10.05.2007
Offline
369
#5

Это не ключи, а набор условий, типа таких:


if(!isset($v2['Sh']) and (!isset($v2['od'])) and $v2['rem'][''.$v['type'].''] and $v2['cat']!==6)

и для каждого варианта будет свой айди (айди варианта). В самом массиве этих циферок нет.

---------- Добавлено 02.11.2015 в 20:03 ----------

yozik13:
Делайте отдельный цыкл foreach для каждого условия по порядку.

Массив здоровый, не хочется его несколько раз перебирать. Лучше перебрать результат foreach.

Gerga
На сайте с 02.08.2015
Offline
94
#6
Samail:
Нужно что-бы строки отвечающие условиям группировались, а не перемешивались.

Записывайте в разные переменные, а затем выводите эти переменные. Должно получиться что-то наподобие этого:


$format = '
<tr>
<td width="90">
<a href="/str=%1\$s" target="_blank"><img src="%2\$s" width="75" height="auto" /></a></td>
<td>
<a href="/str=%1\$s" target="_blank"><strong>%3\$s</strong><br/></a>%4\$s
</td>
<td>***</td><td>***</td>
</tr>
';
foreach( $cart as $k => $v2 ) {
if ( /*условние 1*/ ) {
$res_1 .= sprintf($format, $k, $v2['image'], $res, $resType);
} elseif ( /*условние 2*/ ) {
$res_2 .= sprintf($format, $k, $v2['image'], $res, $resType);
} elseif ( /*условние 3*/ ) {
$res_3 .= sprintf($format, $k, $v2['image'], $res, $resType);
} elseif ( /*условние n*/ ) {
$res_n .= sprintf($format, $k, $v2['image'], $res, $resType);
}
}

echo $res_1, $res_2, $res_3, $res_n;

В переменной $res_1 хранятся все варианты при условии 1. В переменной $res_2 хранится все вариант при условии 2. Если выводить $res_1 затем $res_2, то сначала выведутся все варианты при условии 1, затем все варианты при условии 2. Простенько и со вкусом :)

yozik13
На сайте с 03.11.2012
Offline
84
#7

Непонятно тогда вообще откуда берёться значение ID.

В вашем коде его нет.

Samail
На сайте с 10.05.2007
Offline
369
#8

Я-бы его руками вписал в tr ...но уже не нужно.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий