【问题标题】:PHP sorting object array by certain criteria?PHP按某些标准排序对象数组?
【发布时间】:2010-08-18 12:18:55
【问题描述】:

我有这样的事情:

$i = 0;

foreach($tracks['results'] as $track){
    $trackName[$i] = $track['name'];
    $trackPlaycount[$track['name']] = $track['playcount'];
    $trackPercent[$track['name']] = $track['percent'];
    $i++;
}

$this->trackName = $trackName;
$this->trackPlaycount = $trackPlaycount;
$this->trackPercent = $trackPercent;

如何按播放次数对这些对象进行排序?从我目前所读的内容来看,我可能应该创建一个比较函数,然后让它与 usort() 一起工作,对吧?但我不太确定如何做到这一点......

谢谢




编辑:好的,现在我得到了这样的结果:

public function firstmethod(){
    // there are some more parameters here of course
    // but they worked before, not important for the problem
    $i = 0;
    foreach($tracks['results'] as $track){
        $trackName[$i] = $track['name'];
        $trackPlaycount[$track['name']] = $track['playcount'];
        $trackPercent[$track['name']] = $track['percent'];
        // this part is new
        $tracksArray[$i] = array(
            'name' => $trackName[$i], 
            'playcount' => $trackPlaycount[$track['name']], 
            'percentage' => $trackPercent[$track['name']]
        );
        $i++;
    }

    usort($tracksArray, array($this, 'sortByCount'));

    $i = 0;
    // this is to put the new sorted array into the old variables? 
    foreach($tracksArray as $temp){
        $trackName[$i] = $temp['name'];
        $trackPlaycount[$trackName[$i]] = $temp['playcount'];
        $trackPercent[$trackName[$i]] = $temp['percentage'];
        $i++;
    }

    $this->trackName = $trackName;
    $this->trackPlaycount = $trackPlaycount;
    $this->trackPercent = $trackPercent;
}


public function sortByCount($a, $b){
    if($a["playcount"] == $b["playcount"]) {
        return 0;
    }
    return ($a["playcount"] < $b["playcount"]) ? -1 : 1;
}   

现在可以了... 谢谢大家

【问题讨论】:

  • 编辑了我的答案,因此它包括按整数字段排序,如果这给您带来麻烦,希望对您有所帮助

标签: php sorting object


【解决方案1】:

排序示例:

在自定义函数中,您只需像这样访问您关心的数组键:

?php
$people = array(
    array('id' => 1, 'name' => 'John', 'age' => 12),
    array('id' => 2, 'name' => 'Mary', 'age' => 14),
    array('id' => 3, 'name' => 'Aaaaaadam', 'age' => 15)
);

usort($people, "sortByName");
var_dump($people);
usort($people, "sortByAge");
var_dump($people);

function sortByName($a, $b) {
    return strcmp($a["name"], $b["name"]);
}

function sortByAge($a, $b) { // or playcount or whatever
    if($a["age"] == $b["age"]) {
        return 0;
    }
    return ($a["age"] < $b["age"]) ? -1 : 1;
}

打印排序后的数组(仅粘贴一个,因此不会太长,其他输出相应按年龄排序)

array(3) {
  [0]=>
  array(3) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(9) "Aaaaaadam"
    ["age"]=>
    int(15)
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(4) "John"
    ["age"]=>
    int(12)
  }
  [2]=>
  array(3) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(4) "Mary"
    ["age"]=>
    int(14)
  }
}

【讨论】:

  • 所以,我应该首先在我的循环中填充这个数组数组,然后用函数对其进行排序?还有一件事..既然这一切都应该在一个类中完成,我可以让这个排序函数成为一个私有方法,然后像 usort($people, $this->sortByAge); 一样使用它吗?还是那种方法行不通?
  • 这种方法可以工作,除了像array($this, "sortByAge")那样将实例方法作为回调传递,或者像array("ClassName", "sortByAge")这样的静态方法。
  • 感谢类示例@gnud 的回调,+1
【解决方案2】:

您也可以为此使用SplMaxHeap。借@edorian's $people array,可以做

class SortByAge extends SplMaxHeap
{
    function compare($a, $b)
    {
        return $a['age'] - $b['age'];
    }
}

$sort = new SortByAge;
foreach($people as $person) {
    $sort->insert($person);
}

print_r(iterator_to_array($sort));

这应该是perform somewhat better 而不是usort

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多