Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сортировка двухмерного массива (файлов по их содержимому)
 
 автор: ronin   (30.11.2007 в 13:06)   письмо автору
 
 

Здравствуйте!
имеется страница вывода файлов. файлы сортируются по содержащимся в них строчкам.
А именно: строчки № 4

$name = $_GET[file];
$file = file("../file/users/".$name);

   $users = array();
foreach ($file as $f)
{
  list ($u['author'], $u['namesong'], $u['songlenth'], $u['rate'], $u['nameorigine']) = explode ('|', trim($f));
  $users[] = $u;
 }

таким макаром определяется для редактирования определенный файл, а как сделать сортировку файлов по полю $u['rate']

   
 
 автор: Temnovit   (30.11.2007 в 15:35)   письмо автору
 
   для: ronin   (30.11.2007 в 13:06)
 

http://lv.php.net/manual/ru/function.usort.php

   
 
 автор: ronin   (30.11.2007 в 16:07)   письмо автору
 
   для: Temnovit   (30.11.2007 в 15:35)
 

не получается, потому прошу помощи

   
 
 автор: Zirkon   (30.11.2007 в 16:19)   письмо автору
 
   для: ronin   (30.11.2007 в 16:07)
 

Есть такой вариант - переделываем полученный массив еще в 2 массива:
1 массив - где ключи 0,1,2,3... и т.д. и у каждого ключа как параметры массив с соответствующей частью первоначального массива
2 массив - где ключи 0,1,2,3... и т.д. и как данные для каждого ключа - необходимое вам поле таким образом, что бы было соответствие массивов (1 и 2) по ключам

Далее сортируем второй массив с сохранением ключей и далее проходя по этому массиву объединяем снова 2 массива, выводим их на экран или что там с ними нужно сделать.

   
 
 автор: ronin   (30.11.2007 в 16:51)   письмо автору
 
   для: Zirkon   (30.11.2007 в 16:19)
 

этот принцип не работает,но мне кажется я где то близко :)

$blin = "../file/users/".$file ;

     $users = array(
       $blin => array  ($u['author'], $u['namesong'], $u['songlenth'], $u['rate'], $u['nameorigine'])) ;
  $users[] = $u;

 function s_cmp($a, $b)
{
    $n = 4; // № строчки
    $ra = explode('|', $a);
    $rb = explode('|', $b);
    if($ra[$n]==$rb[$n]) return 0;
    return $ra[$n]>$rb[$n] ? 1 : -1;
}
ksort($users, s_cmp);

   
 
 автор: Zirkon   (30.11.2007 в 16:52)   письмо автору
 
   для: ronin   (30.11.2007 в 16:51)
 

Работает, делал когда-то такое :) Просто нужно внимательно все сделать :)

Еще раз тогда покажу что есть и что требуется сделать :)

есть:

array(
    0 => array (
        'key1' => 'value1',
        'key2' => 2,
        'key3' => 'value3'
    ),
    1 => array (
        'key1' => 'value4',
        'key2' => 8,
        'key3' => 'value6'
    ),
    2 => array (
        'key1' => 'value7',
        'key2' => 5,
        'key3' => 'value9'
    )
)


в принципе этот оставляем как есть и делаем сразу второй массив (из первого, соответствующий первому) и как значение используем то поле, по которому необходимо сделать сортировку:

array(
    0 => 2,
    1 => 8,
    2 => 5
)


сортируем этот второй массив по значениям с сохранением ключей, получаем что-то типа:

array(
    1 => 8,
    2 => 5,
    0 => 2
)


Далее проходим в цикле по этому массиву, и по его ключу определяем какой ключ первоначального массива в данный момент использовать. Так уже более понятно? :)

   
 
 автор: ronin   (30.11.2007 в 18:27)   письмо автору
 
   для: Zirkon   (30.11.2007 в 16:52)
 

если можно, более подробно, для особо одаренных

   
 
 автор: ronin   (01.12.2007 в 13:26)   письмо автору
 
   для: ronin   (30.11.2007 в 18:27)
 

я уже перекопал весь форум, но решения не нашел, прошу помощи!!!

   
 
 автор: sim5   (01.12.2007 в 14:08)   письмо автору
 
   для: ronin   (01.12.2007 в 13:26)
 


<?
function compare($a$b) {
    return 
strcmp($a["as1"], $b["as1"]); //выбираем нужный ключ для сортировки
}

$a = array(array('as1'=>13,'as2'=>25,'as3'=>5),
           array(
'as1'=>11,'as2'=>20,'as3'=>2),
           array(
'as1'=>10,'as2'=>22,'as3'=>3));

usort($a"compare");
print_r($a);
?>

Так надо?

   
 
 автор: ronin   (03.12.2007 в 15:57)   письмо автору
 
   для: sim5   (01.12.2007 в 14:08)
 

честно говоря - не понял

   
 
 автор: sim5   (03.12.2007 в 16:33)   письмо автору
 
   для: ronin   (03.12.2007 в 15:57)
 

Честно говоря и я тоже - как сделать сортировку файлов по полю $u['rate']. Надо понимать сортировку в естественном порядке, от меньшего к большему, тогда Temnovit вам правильно указал на функцию, что же вам надо, если и это не то? Вот я и подумал, что вы не поняли и прописал пример. Собственно в этом примере массив $a будет отсортирован в порядке возрастания, по выбранному ключу. Возьмите свой массив, и укажите в ползовательской функции ключ $u['rate'] - а вдруг это вам надо.

   
 
 автор: ronin   (03.12.2007 в 17:02)   письмо автору
 
   для: sim5   (03.12.2007 в 16:33)
 

я не могу сделать двухмерный массив: состоящий из файлов и содержимового. При этом на странице должны воводиться строчки файлов, отсортированных по "полю" №4 array[3] Т.е. проблема не в сортировке, а в создании двухмерного массива(башка не работает - reset(пиво) - не помогает)

   
 
 автор: sim5   (03.12.2007 в 17:05)   письмо автору
 
   для: ronin   (03.12.2007 в 17:02)
 

А чего тогда вопрос так ставите? ;-)

   
 
 автор: mihdan   (03.12.2007 в 17:06)   письмо автору
 
   для: ronin   (03.12.2007 в 17:02)
 

Ну даешь - как это не можешь создать двумерный массив. Тебе ведь по полочкам разложили

   
 
 автор: sim5   (04.12.2007 в 07:20)   письмо автору
 
   для: ronin   (03.12.2007 в 17:02)
 

Так и не понял, чего вы хотите. Ну во-первых, результат list - это все "задом на перед", и чтобы ориентироваться на №4, нужно:
$users[] = array_reverse($u, true);
Во-вторых, что в полученном массиве, некий ключ его содержит текст, который также надо разбить на массив? Что значит - массив: состоящий из файлов и содержимового?

   
 
 автор: ronin   (04.12.2007 в 10:32)   письмо автору
 
   для: sim5   (04.12.2007 в 07:20)
 

существуют файлы, где находяться записи, состоящие из пяти строчек, разделенные |
имеется страница вывода данных из всех файлов папки, данные сортируются по "полю" №4(interger), при этом это "поле" неуникально.

   
 
 автор: sim5   (04.12.2007 в 10:42)   письмо автору
 
   для: ronin   (04.12.2007 в 10:32)
 

Ну и в чем проблема?

   
 
 автор: ronin   (04.12.2007 в 11:44)   письмо автору
 
   для: sim5   (04.12.2007 в 10:42)
 

я понимаю, что смешно: но я не могу все эти записи вывести на одной строанице. ведь идет обращение к нескольким файлом одновременно.

   
 
 автор: sim5   (04.12.2007 в 12:12)   письмо автору
 
   для: ronin   (04.12.2007 в 11:44)
 

Ни че не понимаю.) Из вашего кода - вы берете файл, разбиваете его строки на массив. Значения этого массива и надо вывести, или получить все файлы, разбить их строки на массив объденяя эти массивы в один, а потом все вывести? Как понять к нескольким файлам одновременно?

   
 
 автор: Zirkon   (04.12.2007 в 12:25)   письмо автору
 
   для: sim5   (04.12.2007 в 12:12)
 

Ничего не понял что он хочет... уже по полочкам выше описал как это сделать - причем такой вариант ранее проверял - работает. Осталось только это все ручками в ПХП прописать... если уже и это трудно... тогда не знаю что и сказать.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования