PHP - 排序ArrayObject

时间:2015-05-29 16:16:30

标签: php sorting arrayobject

我在扩展ArrayObject的PHP类中排序项时遇到问题。

我正在创建我的类,并且我想通过添加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()函数保留在类本身中?

2 个答案:

答案 0 :(得分:4)

你可以这样做,而不是调用一个函数只是让它成为一个匿名函数。

  

仅限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.1.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;
        }
    }

}

答案 1 :(得分:3)

原来这在PHP文档(用户评论部分)中是正确的 - &gt; http://php.net/manual/en/function.uasort.php

4年前

magikMaker 如果要在类或对象中使用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')); 

?>