Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сортировка массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
KreVeDko
Отправлено: 06 Декабря, 2013 - 22:43:24
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




имеем такой отрезок кода:
PHP:
скопировать код в буфер обмена
  1.  
  2. ...
  3. $Players = $Query->GetPlayers();
  4. ...
  5. <?PHP if( Is_Array( $Players ) ): ?>
  6. <?PHP foreach( $Players as $Player ): ?>
  7.         <tr>
  8.         <td><?PHP echo htmlspecialchars( $Player[ 'Name' ] ); ?></td>
  9.         <td><?PHP echo htmlspecialchars( $Player[ 'Frags' ] ); ?></td>
  10.         <td><?PHP echo htmlspecialchars( $Player[ 'TimeF' ] ); ?></td>
  11.         </tr>
  12. <?PHP endforeach; ?>
  13. <?PHP else: ?>
  14.         <tr>
  15.         <td>No players in da house</td>
  16.         </tr>
  17. <?PHP endif; ?>
  18.  

При таком раскладе получаем:

CODE (htmlphp):
скопировать код в буфер обмена
  1. PlayerNick1 29 12:11
  2. PlayerNick2 37 18:15
  3. PlayerNick3 12 11:01
  4. PlayerNick4 4 2:34
  5. PlayerNick5 10 5:24
  6. PlayerNick6 45 24:45


Нужно:
CODE (htmlphp):
скопировать код в буфер обмена
  1. PlayerNick6 45 24:45
  2. PlayerNick2 37 18:15
  3. PlayerNick1 29 12:11
  4. PlayerNick3 12 11:01
  5. PlayerNick5 10 5:24
  6. PlayerNick4 4 2:34


По возможности надо добавить номер игрока в таблице:
CODE (htmlphp):
скопировать код в буфер обмена
  1. #1 PlayerNick6 45 24:45
  2. #2 PlayerNick2 37 18:15
  3. #3 PlayerNick1 29 12:11
  4. #4 PlayerNick3 12 11:01
  5. #5 PlayerNick5 10 5:24
  6. #6 PlayerNick4 4 2:34


нужно отсортировать данные массива по ключу (значению? не шарю в этом) Frags (Frags имеет числовое значение)

(Отредактировано автором: 07 Декабря, 2013 - 14:53:07)

 
 Top
Master_YI
Отправлено: 07 Декабря, 2013 - 00:52:55
Post Id



Частый гость


Покинул форум
Сообщений всего: 149
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)




По Frags? А это у вас число?
 
 Top
KreVeDko
Отправлено: 07 Декабря, 2013 - 01:24:34
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Master_YI пишет:
По Frags? А это у вас число?

да
 
 Top
Master_YI
Отправлено: 07 Декабря, 2013 - 01:34:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 149
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)




 
 Top
KreVeDko
Отправлено: 07 Декабря, 2013 - 14:12:12
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Master_YI пишет:
http://www.php.net/manual/ru/array.sorting.php

уже смотрел, но так и не понял, по этому и обратился сюда.
 
 Top
dXdYdZ
Отправлено: 07 Декабря, 2013 - 14:50:19
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




По-моему, лучше сортировать на этапе выборки из БД. (ORDER BY)
 
 Top
KreVeDko
Отправлено: 07 Декабря, 2013 - 14:55:00
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Поправил шапку темы.
dXdYdZ пишет:
По-моему, лучше сортировать на этапе выборки из БД. (ORDER BY)

Данные получаем с сервера:
PHP:
скопировать код в буфер обмена
  1.  
  2. define( 'SQ_SERVER_ADDR', '193.26.217.19' );
  3. define( 'SQ_SERVER_PORT', 27777 );
  4. define( 'SQ_TIMEOUT',     1 );
  5. define( 'SQ_ENGINE',      SourceQuery :: GOLDSOURCE );
  6. //$Timer0 = MicroTime( true );
  7. $Query = new SourceQuery( );
  8.     try
  9.     {
  10.     $Query->Connect( SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE );
  11.     //$info = $Query->GetInfo();
  12.     //$rules = $Query->GetRules();
  13.     //$player = $Query->GetPlayers();
  14.         $Players = $Query->GetPlayers();
  15.     }
  16.     catch( Exception $e )
  17.     {
  18.     echo $e->getMessage( );
  19.     }
  20.     $Query->Disconnect( );
  21.  

(Отредактировано автором: 07 Декабря, 2013 - 14:55:24)

 
 Top
dXdYdZ
Отправлено: 07 Декабря, 2013 - 15:15:47
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Ну вот, похоже, где-то в коде getPlayers() содержится сам запрос. Можно переделать эту функцию, чтобы вызывать её так:
PHP:
скопировать код в буфер обмена
  1. Players = $Query->GetPlayers($sort_id);

Где $sort_id-идентификатор сортировки. Например, 0-frags,1-frags DESC.
Либо перед вызовом функции getPlayers выставлять

(опять таки, идентификатор сортировки)
В любом случае, для этого надо модифицировать класс SourceQuery.

(Отредактировано автором: 07 Декабря, 2013 - 15:16:36)

 
 Top
KreVeDko
Отправлено: 07 Декабря, 2013 - 15:31:01
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Возможно будет легче, код функции:
PHP:
скопировать код в буфер обмена
  1.                 public function GetPlayers( )
  2.                 {
  3.                         if( !$this->Connected )
  4.                         {
  5.                                 return false;
  6.                         }
  7.                        
  8.                         switch( $this->GetChallenge( self :: A2S_PLAYER, self :: S2A_PLAYER ) )
  9.                         {
  10.                                 case self :: GETCHALLENGE_FAILED:
  11.                                 {
  12.                                         return false;
  13.                                 }
  14.                                 case self :: GETCHALLENGE_ALL_CLEAR:
  15.                                 {
  16.                                         $this->Socket->Write( self :: A2S_PLAYER, $this->Challenge );
  17.                                         $this->Socket->Read( );
  18.                                        
  19.                                         $Type = $this->Buffer->GetByte( );
  20.                                        
  21.                                         if( $Type == 0 )
  22.                                         {
  23.                                                 return false;
  24.                                         }
  25.                                         else if( $Type != self :: S2A_PLAYER )
  26.                                         {
  27.                                                 throw new SourceQueryException( 'GetPlayers: Packet header mismatch. (0x' . DecHex( $Type ) . ')' );
  28.                                         }
  29.                                        
  30.                                         break;
  31.                                 }
  32.                         }
  33.                        
  34.                         $Players = Array( );
  35.                         $Count   = $this->Buffer->GetByte( );
  36.                        
  37.                         while( $Count-- > 0 && $this->Buffer->Remaining( ) > 0 )
  38.                         {
  39.                                 $Player[ 'Id' ]    = $this->Buffer->GetByte( ); // PlayerID, is it just always 0?
  40.                                 $Player[ 'Name' ]  = $this->Buffer->GetString( );
  41.                                 $Player[ 'Frags' ] = $this->Buffer->GetLong( );
  42.                                 $Player[ 'Time' ]  = (int)$this->Buffer->GetFloat( );
  43.                                 $Player[ 'TimeF' ] = GMDate( ( $Player[ 'Time' ] > 3600 ? "H:i:s" : "i:s" ), $Player[ 'Time' ] );
  44.                                
  45.                                 $Players[ ] = $Player;
  46.                         }
  47.                        
  48.                         return $Players;
  49.                 }

(Отредактировано автором: 07 Декабря, 2013 - 15:34:59)

 
 Top
DelphinPRO
Отправлено: 07 Декабря, 2013 - 15:47:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Перед выводм данных сортируем массив:
PHP:
скопировать код в буфер обмена
  1. usort($Players, function($a, $b){
  2.     if ($a['Frags'] == $b['Frags']) return 0;
  3.     return ($a['Frags'] < $b['Frags']) ? -1 : 1;
  4. });


Для сортировки в обратную сторону, поменяйте знак "<" на ">" в третьей строчке.

(Отредактировано автором: 07 Декабря, 2013 - 15:50:14)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
KreVeDko
Отправлено: 07 Декабря, 2013 - 16:17:38
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




[quote=DelphinPRO][/quote] Спасибо, работает.
Теперь осталось добавить номер каждому игроку в таблице, не подскажите?
CODE (htmlphp):
скопировать код в буфер обмена
  1. #1 PlayerNick6 45 24:45
  2. #2 PlayerNick2 37 18:15
  3. #3 PlayerNick1 29 12:11
  4. #4 PlayerNick3 12 11:01
  5. #5 PlayerNick5 10 5:24
  6. #6 PlayerNick4 4 2:34

(Добавление)
Туповатый вопрос, ++$number ... А может быть есть альтернатива?
(Добавление)
DelphinPRO пишет:
Перед выводм данных сортируем массив:
PHP:
скопировать код в буфер обмена
  1. usort($Players, function($a, $b){
  2.     if ($a['Frags'] == $b['Frags']) return 0;
  3.     return ($a['Frags'] < $b['Frags']) ? -1 : 1;
  4. });


Для сортировки в обратную сторону, поменяйте знак "<" на ">" в третьей строчке.

А если у меня выходит несколько одинаковых значений по Frags,
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. PlayerNick3 0 1:01
  3. PlayerNick5 0 4:24
  4. PlayerNick4 0 2:34

то как пересортировать по TimeF ?
Чтобы было вот так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. PlayerNick5 0 4:24
  3. PlayerNick4 0 2:34
  4. PlayerNick3 0 1:01
 
 Top
DelphinPRO
Отправлено: 07 Декабря, 2013 - 18:09:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. if ($a['Frags'] == $b['Frags']) {
  2.  
  3.     if ($a['TimeF'] == $b['TimeF']) return 0;
  4.     return ($a['TimeF'] < $b['TimeF']) ? -1 : 1;
  5.  
  6. }


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 07 Декабря, 2013 - 18:13:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)





KreVeDko пишет:
Как вывести букву А?

DelphinPRO пишет:
<?php echo 'А'; ?>

KreVeDko пишет:
Спасибо! А как вывести букву Б?

DelphinPRO пишет:
<?php echo 'Б'; ?>
 
 Top
KreVeDko
Отправлено: 07 Декабря, 2013 - 18:45:58
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




DelphinPRO пишет:
PHP:
скопировать код в буфер обмена
  1. if ($a['Frags'] == $b['Frags']) {
  2.  
  3.     if ($a['TimeF'] == $b['TimeF']) return 0;
  4.     return ($a['TimeF'] < $b['TimeF']) ? -1 : 1;
  5.  
  6. }

не получается объединить с кодом выше.
 
 Top
DelphinPRO
Отправлено: 07 Декабря, 2013 - 20:46:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DeepVarvar Покатываюсь со смеху
-------------------

PHP:
скопировать код в буфер обмена
  1. usort($Players, function($a, $b){
  2.  
  3.     if ($a['Frags'] == $b['Frags']) {
  4.  
  5.         if ($a['TimeF'] == $b['TimeF']) return 0;
  6.         return ($a['TimeF'] < $b['TimeF']) ? -1 : 1;
  7.  
  8.     }
  9.  
  10.     return ($a['Frags'] < $b['Frags']) ? -1 : 1;
  11.  
  12. });


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB