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

Форум PHP

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

 

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

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

тема: Функция сортировки массива в классе
 
 автор: neokortex   (26.06.2010 в 18:10)   письмо автору
 
 

Пишу класс, а там функция сортировки массива. Выглядит это так

class array_class {
    public $array_; // массив с которым работаем
    public $sort_by; // параметр по которму сортируем массив
    //// далее функция сортировки массива
    public function sort_array() {
        function sort_function($a, $b) {
             return strcmp($a[$this->sort_by], $b[$this->sort_by]);
        }
        usort ($this->array_, "sort_function");
    }
};
//// Вызов класса
$array_class = new array_class();
$array_class->array_=$my_array;
$array_class->sort_by='position';
$array_class->sort_array();

Так вот это все дело выдает ошибку: Fatal error: Using $this when not in object context in в строке

return strcmp($a[$this->sort_by], $b[$this->sort_by]);

Не пойму как сделать. Кучу вариантов перепробовал. Помогите, пожалуйста.

  Ответить  
 
 автор: Тень&   (26.06.2010 в 18:24)   письмо автору
 
   для: neokortex   (26.06.2010 в 18:10)
 

http://ru2.php.net/manual/en/functions.anonymous.php

  Ответить  
 
 автор: neokortex   (26.06.2010 в 18:27)   письмо автору
 
   для: Тень&   (26.06.2010 в 18:24)
 

не разобрался :(
можно на моем примере?

  Ответить  
 
 автор: Тень&   (26.06.2010 в 18:29)   письмо автору
 
   для: neokortex   (26.06.2010 в 18:27)
 

Ну сначала скажи свою версию PHP. Пример будет для PHP 5.3.0 и выше.

  Ответить  
 
 автор: neokortex   (26.06.2010 в 18:33)   письмо автору
 
   для: Тень&   (26.06.2010 в 18:29)
 

5.2.4 А универсального решения нет? Может логику изменить или так и придется все ручками все время прописывать?

  Ответить  
 
 автор: Тень&   (26.06.2010 в 18:45)   письмо автору
 
   для: neokortex   (26.06.2010 в 18:33)
 

Тогда http://ru.php.net/manual/en/function.create-function.php, но, чую, скоро там будет надпись "deprecated"

  Ответить  
 
 автор: sim5   (26.06.2010 в 18:59)   письмо автору
 
   для: neokortex   (26.06.2010 в 18:33)
 

А что у вас за массив и что должно быть результатом сортировки? Кусочек массива покажите, и результат его сортировки.

  Ответить  
 
 автор: Trianon   (26.06.2010 в 19:04)   письмо автору
 
   для: neokortex   (26.06.2010 в 18:10)
 

дык ить контекст класса-то в обычной функции теряется...

  Ответить  
 
 автор: sms-send   (26.06.2010 в 20:23)   письмо автору
 
   для: neokortex   (26.06.2010 в 18:10)
 

// <?php
class array_class {
    public 
$array_// массив с которым работаем
    
public $sort_by// параметр по которму сортируем массив
    
private function sort_function($a$b) {
         return 
strcmp($a[$this->sort_by], $b[$this->sort_by]);
    }
    
//// далее функция сортировки массива
    
public function sort_array() {
        
usort ($this->array_, array($this"sort_function"));
    }
};

  Ответить  
 
 автор: Trianon   (26.06.2010 в 20:24)   письмо автору
 
   для: sms-send   (26.06.2010 в 20:23)
 

Вы же не пробовали запустить этот код, не так ли?

  Ответить  
 
 автор: sms-send   (26.06.2010 в 20:27)   письмо автору
 
   для: Trianon   (26.06.2010 в 20:24)
 

Пробовал, всё прекрасно работает.

  Ответить  
 
 автор: Trianon   (26.06.2010 в 20:43)   письмо автору
 
   для: sms-send   (26.06.2010 в 20:27)
 

пардон.. проглядел второй аргумент usort

  Ответить  
 
 автор: Тень&   (26.06.2010 в 21:52)   письмо автору
 
   для: sms-send   (26.06.2010 в 20:23)
 

Неприятность в том, что метод сравнения для сортировки как бы не относится к классу array_class. Не ООПшно. Поэтому тут должна быть только лямбда/анонимная функция.

  Ответить  
 
 автор: sms-send   (27.06.2010 в 00:56)   письмо автору
 
   для: Тень&   (26.06.2010 в 21:52)
 

Я всего лишь исправил вариант автора на идентичный, но работающий.

ООПшно можно определить интерфейс Comparer и реализовывать его сколько угодно раз с нужными вариантами метода (обходясь без анонимных функций).

По предложенной автором версии не видно, чтобы его волновала эта проблема. Возможно ещё не дошёл до этой части, а возможно в этом классе действительно нужен единственный вариант сравнения.

  Ответить  
Rambler's Top100
вверх

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