基于PHP的class->值对新类项的数组进行排序

时间:2014-06-29 19:00:27

标签: php sorting

我有一系列项目

class Item{
   public $username = "";
   public $id =""
   public function __construct($id,$user){
     if($input != "")
       $this->id = $id;
     if($username !="")
       $this->username = $user;
   }
}

我正在抓取一些已经解析过的json数据(正确)。 我正在拿Json并为每个退回的项目制作一个new Item($userid, $username); 然后我想按用户ID排序,所以我有以下内容。

$ItemArray = array();
foreach($jsonData as $data){
  $username = $data['username'];
  $id = $data['id'];
  $ItemArray = new Item($id,$username);
}

现在我遇到的问题是我试图获取$id并按高号到低号码组织它。

如果我创建$id s的单个数组,则以下代码将起作用。但是,如果我使用我的实际变量,它将无法工作。

function cmp($a, $b) {
  if($a == $b) 
     return 0;
  else 
     return $a < $b ? 1 : - 1; // reverse order
}
usort($array, "cmp");

(这不是我真正的代码,我正在解决我的实际问题,并简化了所有内容。实际上,我实际上有几百行代码。我只需要简单地表示我的问题,因为我可以'让我的东西上班。

2 个答案:

答案 0 :(得分:0)

所以我要做的就是更多地检查以确保通过的每个对象都是它所假设的对象类型。我使用了冒泡排序类型的算法,因为我将它设置为返回已排序的数组。然后我遍历每个值。以下是bubbleSort函数

function bubbleSort($array) {
 if(! $length = count($array)) {
  return $array;
 }

 for($outer = 0; $outer < $length; $outer ++) {
  for($inner = 0; $inner < $length; $inner ++) {
   if(is_object($array[$outer]) && is_object($array[$inner])) {
    if($array[$outer]->id < $array[$inner]->id) {
     $tmp = $array[$outer];
     $array[$outer] = $array[$inner];
     $array[$inner] = $tmp;
    }
   }
  }
 }
 return $array;
}

我很快意识到我需要一种方法来包含全球范围内的所有帖子。所以在.php页面的最顶层我有以下课程。

class Itemarray{
    private $items = "";
    public function getItems(){ if(isset($items){return $$items;}}
    public function setItems($item){
        $this-$items[] = $item;
    }
}
$ItemArray = new Itemarray();

当我在原始帖子的循环中创建$ items时,我将foreach循环更新为以下

foreach($jsonData as $data){
  $username = $data['username'];
  $id = $data['id'];
  $ItemArray->setItems(new Item($id,$username));
}

接下来的部分是我如何遍历每个数组并打印出所需的数据。

echo '<table>';
echo '    <tr>'; 
echo '       <td>The User IDs are:</td>';
echo '       <td>The Usernames are:</td>';
echo '    </tr>';

foreach(bubbleSort($ItemArray->getItems()) as $item) {
    echo '<tr>'; 
    echo '    <td>'.$item->id.'</td>';
    echo '    <td>'.$item->username.'</td>';
    echo '</tr>';
}
echo '</table>';

请注意,此解决方案是针对我的个人问题而设计的,而我的解决方案无效。

答案 1 :(得分:0)

为什么这样一个复杂的方法,编写自己的排序算法,当你可以轻松地使用usort()和一个对象数组时:

function cmp($a, $b) {
  if($a->id == $b->id) 
     return 0;
  else 
     return $a->id < $b->id ? 1 : -1;
}
usort($array, "cmp");

id

排序

或者当你从json中提取它时,甚至将每个项目推送到SPLHeap,使用类似于上面的compare()方法