2015-05-29 2 views
0

У меня возникла проблема с сортировкой элементов в классе PHP, который расширяет ArrayObject.PHP - Сортировка ArrayObject

Я создаю свои классы, и единственный способ, которым я решил добавить функцию cmp(), - поместить ее в один и тот же файл, но вне класса. Похоже, что я не могу сказать что-то другое из-за того, что uasort требует имя функции в виде строки.

Так я это делаю:

class Test extends ArrayObject{ 

    public function __construct(){ 
     $this[] = array('test' => 'b'); 
     $this[] = array('test' => 'a'); 
     $this[] = array('test' => 'd'); 
     $this[] = array('test' => 'c'); 
    } 


    public function sort(){ 
     $this->uasort('cmp'); 
    } 

} 

function cmp($a, $b) { 
    if ($a['test'] == $b['test']) { 
     return 0; 
    } else { 
     return $a['test'] < $b['test'] ? -1 : 1; 
    } 
} 

Что хорошо, если я только с помощью одного класса, как это, но если я использую два (либо автозагрузкой или требуют), то он распадается на попытки дважды вызовите cmp().

Я думаю, моя точка зрения - это просто плохой способ сделать это. Есть ли другой способ сохранить функцию cmp() внутри самого класса?

+0

Я знаю, что могу называть их разными вещами, но это похоже не на такое большое решение. – dgig

+0

Создайте файл util.php, содержащий эту функцию и другую аналогичную функцию полезности. Затем require_once ('util.php'); когда вам это нужно. – dan08

ответ

3

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

PHP 5.3.0 или выше только

class Test extends ArrayObject{ 

    public function __construct(){ 
     $this[] = array('test' => 'b'); 
     $this[] = array('test' => 'a'); 
     $this[] = array('test' => 'd'); 
     $this[] = array('test' => 'c'); 
    } 


    public function sort(){ 
     $this->uasort(function($a, $b) { 
      if ($a['test'] == $b['test']) { 
       return 0; 
      } else { 
       return $a['test'] < $b['test'] ? -1 : 1; 
      } 
     }); 
    } 
} 

Как анонимные функции работают только на PHP 5.3.0 или выше, это будет вариант более совместимы, если вы должны быть ориентированы на PHP версии ниже 5.3.0

Ниже PHP 5.3.0

class Test extends ArrayObject{ 

    public function __construct(){ 
     $this[] = array('test' => 'b'); 
     $this[] = array('test' => 'a'); 
     $this[] = array('test' => 'd'); 
     $this[] = array('test' => 'c'); 
    } 


    public function sort(){ 
     $this->uasort(array($this, 'cmp')); 
    } 

    public function cmp($a, $b) { 
     if ($a['test'] == $b['test']) { 
      return 0; 
     } else { 
      return $a['test'] < $b['test'] ? -1 : 1; 
     } 
    } 

} 
+0

Проклятье, это интересно, я поклялся, что попробовал это и это не сработало. Спасибо, это прекрасно выполнимое решение. – dgig

+2

какая версия php вы используете? Анонимные функции не стали доступны до тех пор, пока PHP 5.3.0 – Augwa

+0

Хорошая точка для тех, кто находится далеко назад. Я на 5.3.2 (к счастью для этого, к сожалению, вообще). – dgig

3

Оказывается, это был прав в PHP документации (комментарии пользователей раздел) ->http://php.net/manual/en/function.uasort.php

magikMaker 4 года назад быстрое напоминание о синтаксисе, если вы хотите использовать uasort в классе или объекта :

<?php 

// procedural: 
uasort($collection, 'my_sort_function'); 

// Object Oriented 
uasort($collection, array($this, 'mySortMethod')); 

// Objet Oriented with static method 
uasort($collection, array('self', 'myStaticSortMethod')); 

?> 
+1

Я был в процессе ввода этого. +1 для фактического чтения руководства (и комментариев). Кроме того, [руководство] (http://php.net/uasort) говорит, что см. [Usort] (http://php.net/usort) для получения подробной информации о функции сравнения, и на этой странице есть [пример] (http://php.net/manual/en/function.usort.php#function.usort.examples.object) доступ к статическому классу. –

+0

Я думаю, что настоящий глубокий ответ здесь, узнав о «вызываемом» типе здесь: http://php.net/manual/en/language.types.callable.php – dgig

Смежные вопросы