Я бы сделал на регулярных выражениях:
CODE:<?php
header('content-type: text/plain; charset=windows-1251');
$result = array();
$matches = array();
$file = fopen('file.txt', 'r');
while ($line = fgets($file))
if (preg_match('/^id(\d+)(\|[^\|]+\|)(\d+)$/', trim($line), $matches))
$result[(int)$matches[3]][] = "id $matches[1] $matches[2] $matches[3]";
fclose($file);
foreach ($result as $key => $value)
$result[$key] = implode("\n", $value);
krsort($result);
echo implode("\n", $result);
?>
Этот код оставляет несколько значений с общим ключом в порядке следования в файле, однако, по-моему, очевидно, как тут добавить ещё 1 ключ и отсортировать по нему, если надо.
Что касается сортировки в случае нескольких одинаковых значений, то тут, по-моему, ничего не гарантируется:
CODE:array( 4, 2, 5, 4, 1, 4 )
После сортировки выглядит так:
CODE:Array
(
[4] => 1
[1] => 2
[3] => 4
[0] => 4
[5] => 4
[2] => 5
)