Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Сортировка масива


Автор: Гость_Вася 7.10.2003, 10:12
Помогите мне отсортировать массив не стандартными функцыми, типа
Код
<?
 $a=1;
 $max1=array (); // id
 $max2=array (); // Количество нажатий
 $max3=array (); // href
 $max4=array (); // Имя реферата

 $fh = fopen('base.dat', "r");
 while (! feof($fh)) :
 $line = fgets($fh, 4096);
 list($grupa, $id, $press, $link, $name) = explode("::", $line);
 $max1[$a]=$id;
 $max2[$a]=$press;
 $max3[$a]=$link;
 $max4[$a]=$name;
 print"$max2[$a]<br>";
 $a++;

 endwhile;
 print "<br><br>$a<br><br>";
 // Sortirovka

 for ($i=2; $i<=$a-1; $i++):


  for ($j=$a; $i<=$j; $j==$j-1):


    if (($max2[$j-1])<($max2[$j])){
    $buf=$max2[$j-1];      //Менякм местами нажатия
    $max2[$j-1]=$max2[$j];
    $max2[$j]=$buf;

   }
  endfor;
 endfor;
 for ($z=1; $z<=$a-1; $z++):
 print"<b>$max1[$z] - $max2[$z]<br></b>";
 endfor;
 fclose($fh);
?>

Тут ошибка, немного глючит, подскажите свой вариант сортировки! Нужно тут отсортировать числовой масив $max2 exclamation.gif
Всем спасибо!

Автор: Master 7.10.2003, 10:32
Это надо сначала объяснить на пальцах... что собственно надо и как отсортировать...

Автор: Гость_Вася 9.10.2003, 10:23
Есть массив а состоящий из чисел 1, 9, 5, 2, 4, 3, 7, 6, 0 и мне его надо отсортировать по возрастанию не стандартными функциами, а самому написать как в примере выше!

Автор: Гость_Вася 9.10.2003, 10:24
Чтото в роде такой сортировки надо
Код

for ($i=2; $i<=$a-1; $i++):


 for ($j=$a; $i<=$j; $j==$j-1):


   if (($max2[$j-1])<($max2[$j])){
   $buf=$max2[$j-1];      //Менякм местами нажатия
   $max2[$j-1]=$max2[$j];
   $max2[$j]=$buf;

  }
 endfor;
endfor;

Автор: Master 9.10.2003, 11:26
А зачем? Если есть уже готовые... функции написанные на пхп работают медленне встроенных функций

Автор: Secandr 9.10.2003, 12:18
Гость_Вася>> А если попробывать завести массив массивов?

$max=array($id,$press,$link,$name);

или даже так:

$max[$id]=array($press,$link,$name);

Автор: MuToGeN 9.10.2003, 12:30
А не проще ли БД для этого пользовать?
SQL
SELECT * FROM someTable ORDER BY someField;

Автор: Secandr 9.10.2003, 15:12
Вот из манулов пример:
Код
function cmp ($a, $b) {  
   if ($a == $b) return 0;
   return ($a < $b) ? -1 : 1;
}

usort ($a, "cmp");
А вот так его переделать:
Код
$max[]=array($id,$press,$link,$name);
/***Заполняем массив
***/
function cmp ($a, $b) {  
   if ($a[1] == $b[1]) return 0;
   return ($a[1] < $b[1]) ? -1 : 1;
}

usort ($max, "cmp");

Это сортировка по $press

Автор: Гость_ВАся 10.10.2003, 03:24
Мне именно надо собственную, всем спасибо!

Автор: Вася2 10.10.2003, 19:26
Есть текстовой файл baza.txt, в нем записанны данные:
Код

547|Книги
13|Тетрадий
345|Ручек
765|Карандашей
1|Дневник
9876|Листов

Первое число количество, второе - название. Читаем файл в массив. Надо отсортировать массив по возрастанию так чтобы при сортировки по количеству названия сразу тоже перемещались и получилось в конце:
Код

9876шт. - Листов
765шт. - Карандашей
547шт. - Книги
345шт. - Ручек
13шт. - Тетрадей
1шт. - Дневник

Автор: Vaulter 11.10.2003, 14:48
asort($array)

Автор: MuToGeN 15.10.2003, 09:24
2Вася2:
Модератор: пожалуйста, не дублируйте постинги.

Автор: Вася2 15.10.2003, 09:27
в смымсли
Цитата
пожалуйста, не дублируйте постинги.

Автор: MuToGeN 15.10.2003, 09:36
> в смымсли
Постинг <<Есть текстовой файл baza.txt...>> появился второй раз с разницей по времени в несколько дней.

Автор: Вася2 15.10.2003, 17:20
Почему, мне надо отсортировать а потом не записывать в массив!

Автор: Вася2 16.10.2003, 03:30
Я имею виду мне надо отсортировать тот файл а потом не куда не записывать

Автор: Secandr 16.10.2003, 08:43
А как ты хочешь отсортировать файл не читая его? Если ты его читаешь, то информация "сохраняется" в памяти. И удобней "сохранять" её в виде массива. А затем ты уже можешь печатать этот массив, сохранять в тот же файл,...

Автор: Вася2 17.10.2003, 03:34
Secandr
Цитата
А как ты хочешь отсортировать файл не читая его? Если ты его читаешь, то информация "сохраняется" в памяти. И удобней "сохранять" её в виде массива. А затем ты уже можешь печатать этот массив, сохранять в тот же файл,...

Вы бы не могли написать мне код программы по вашему примеру, подробней, спасибо!

Автор: Secandr 17.10.2003, 07:25
А что программа должна делать?
Вопрос был: "как отсортировать массив?". На него ответили. Что кроме этого сделать нужно?

Автор: Вася2 18.10.2003, 18:52
Цитата
А что программа должна делать?
Вопрос был: "как отсортировать массив?". На него ответили. Что кроме этого сделать нужно?
Надо отсортировать как я написал выше и вывести на экран!

Автор: Secandr 19.10.2003, 09:53
Если первый вариант:
Код
$max[]=array($id,$press,$link,$name);
/***Заполняем массив (читаем из файла)
***/
function cmp ($a, $b) {  
  if ($a[1] == $b[1]) return 0;
  return ($a[1] < $b[1]) ? -1 : 1;
}

usort ($max, "cmp");

foreach ($max as $v)
{
echo "\n<br>id=".$v[0];
echo "\n<br>press=".$v[1];
echo "\n<br>link=".$v[2];
echo "\n<br>name=".$v[3];
echo "<hr>";
}
Если второй
Код
asort($array);
foreach ($array as $k=>$v)
{
echo "$k шт. - $v<br>\n";
}

Автор: Вася2 20.10.2003, 19:20
Цитата
$max[]=array($id,$press,$link,$name);
/***Заполняем массив (читаем из файла)
***/
function cmp ($a, $b) { 
  if ($a[1] == $b[1]) return 0;
  return ($a[1] < $b[1]) ? -1 : 1;
}

А как мне мой файл прочитать в такой массив, вы простите за глупые вопросы, я только начал изучать ПХП

Автор: Secandr 21.10.2003, 07:14
Если файл такой:
Код
547|Книги
1|13|www.ru|Тетрадий
2|9876|www.ya.ru|Листов
То можно попробывать так:
Код
$tmp=readfile('my_bd.txt');
foreach ($tmp as $v)
 {
   $max[]=split('|',$v,4);
 }
Хотя не ручаюсь что работать будет безотказно

Автор: Вася2 22.10.2003, 17:06
Код
<?
$max[]=array($id,$press,$link,$name);
$tmp=readfile('base.dat');
foreach ($tmp as $v)
{
  $max[]=split('|',$v,4);
}
function cmp ($a, $b) {
 if ($a[1] == $b[1]) return 0;
 return ($a[1] < $b[1]) ? -1 : 1;
}

usort ($max, "cmp");

foreach ($max as $v)
{
echo "\n<br>id=".$v[0];
echo "\n<br>press=".$v[1];
echo "\n<br>link=".$v[2];
echo "\n<br>name=".$v[3];
echo "<hr>";
}

?>

Ваша программа не работает, посмотрите и исправьте ошибки, спасибо!

Автор: MuToGeN 22.10.2003, 17:57
что говорит?

Автор: Dagger_live 22.10.2003, 20:35
$max2 = array(1,2,5,2,9,3,4);
$j = 0;
for( $i = 0; $i < sizeof( $max2 ); $i++){
if( $max2[$i] > $max2[$i+1]){ // change > to < for decrease or increase or contrary
$j = $max2[$i];
$max2[ $i ] = $max2[ $i + 1 ];
$max2[ $i + 1 ] = $j;
}
}

Автор: Dr.Death 22.10.2003, 21:37
Dagger_live>>А если за один проход цикла мы не отсортируем массив, то как?
По мойму надо еще одну штуку сделать:
Код

$max2 = array(1,2,5,2,9,3,4);
$j = 0;
while($cnt>0)
{
$cnt=0;
for( $i = 0; $i < sizeof( $max2 ); $i++){
if( $max2[$i] > $max2[$i+1]){ // change > to < for decrease or increase or contrary
$j = $max2[$i];
$max2[ $i ] = $max2[ $i + 1 ];
$max2[ $i + 1 ] = $j;
$cnt++;
}
}
}  

Автор: Secandr 23.10.2003, 09:41
Dagger_live>> Зачем писать сортировку массива? Есть asort,usort, sort. !!!!!!

Почему бы просто не написать sort($max2) confused.gif?

Автор: Вася2 23.10.2003, 17:15
Dagger_live: Скрипт сортирует плохо!
Результат:
Код

1
2
5
6
9
3
4

У меня был массив такой: $max2 = array(1,2,5,6,9,3,4);
А ваша (Dr.Death) сортировка вобще не работает.
Выдается ошибка:
Код

Notice: Undefined variable: cnt in E:\localhost\SORT.PHP on line 24

Подскажите как иправить этот глюк!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)