Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据php对象的一个属性值对其重新排序_Php_Sorting_Object - Fatal编程技术网

根据php对象的一个属性值对其重新排序

根据php对象的一个属性值对其重新排序,php,sorting,object,Php,Sorting,Object,假设我有一个对象,$obj,在这个foreach()循环之后: foreach($obj as $row){ echo 'file_id:'.$row->file_id.'-name:'.$row->name.'<br>'; } 如何对$obj进行排序,以便选择第一个echo'd$row?例如,如果我在某处插入了322,结果如下所示: file_id:321-name:321-is-good file_id:322-name:322-is-better file

假设我有一个对象,
$obj
,在这个
foreach()
循环之后:

foreach($obj as $row){
    echo 'file_id:'.$row->file_id.'-name:'.$row->name.'<br>';
}
如何对
$obj
进行排序,以便选择第一个
echo
'd
$row
?例如,如果我在某处插入了
322
,结果如下所示:

file_id:321-name:321-is-good
file_id:322-name:322-is-better
file_id:323-name:323-is-best
file_id:322-name:322-is-better
file_id:323-name:323-is-best
file_id:321-name:321-is-good
如果我插入了
323

file_id:323-name:323-is-best
file_id:321-name:321-is-good
file_id:322-name:322-is-better
我知道这可能涉及到
usort()
,但我无法理解需要做什么

想法

谢谢,
tim

假设您希望在特定开始时按
文件id
排序,并附加前面的内容,该内容也按
文件id
排序:

$sort = '323';
usort($arr,function($a,$b) use ($sort) {
   //normal sorting for low-ids after high-ids
   if($a->file_id < $sort && $a->file_id < $sort){
      return strcmp($a->file_id,$b->file_id);
   } 
   //if only $a is smaller $a should be later
   if($a->file_id < $sort) return 1;
   //if only $b is smaller $a should be earlier
   if($b->file_id < $sort) return -1;
   //both above $sort, sort normally
   return strcmp($a->file_id,$b->file_id);
 });
$sort='323';
usort($arr,function($a,$b)use($sort){
//高ID后低ID的正常排序
如果($a->file\u id<$sort&&$a->file\u id<$sort){
返回strcmp($a->file\u id,$b->file\u id);
} 
//如果$a较小,则$a应稍后
如果($a->file_id<$sort)返回1;
//如果只有$b更小,那么$a应该更早
如果($b->file_id<$sort)返回-1;
//都高于$sort,正常排序
返回strcmp($a->file\u id,$b->file\u id);
});

使用对象而不是数组的工作示例:

<?php
//build a test with arrays is easier;
$arr = new ArrayObject(array(
    array('file_id' => '321','name' => '321 is good'),
    array('file_id' => '322','name' => '322 is better'),
    array('file_id' => '323','name' => '323 is best')));
//cast all to object for purposes of testing objects
foreach($arr as &$val) $val = (object)$val;
//when you used a reference _always_ unset... trust me on this one
unset($val);

$sort = '323';
// we define the callback separately because for this test we use it more then once
// don't pay much attention to the reference as &$sort, this is just to alter it in 
// multiple tests, and should not be needed in the actual implementation.

$callback = function($a,$b) use (&$sort) {
   //normal sorting for low-ids after high-ids
   if($a->file_id < $sort && $b->file_id < $sort){ //$a & $b indeed, not $a twice ;)
      return strcmp($a->file_id,$b->file_id);
   }
   //if only $a is smaller $a should be later
   if($a->file_id < $sort) return 1;
   //if only $b is smaller $a should be earlier
   if($b->file_id < $sort) return -1;
   //both above $sort, sort normally
   return strcmp($a->file_id,$b->file_id);
};

//322 first:
$sort='322';
$arr->uasort($callback);
var_dump($arr);

//323 first:
$sort='323';
$arr->uasort($callback);
var_dump($arr);

//321 again first:
$sort='321';
$arr->uasort($callback);
var_dump($arr);

//non-existing:
$sort='400';
$arr->uasort($callback);
var_dump($arr);



object(ArrayObject)#1 (1) {
  ["storage":"ArrayObject":private]=>
  array(3) {
    [1]=>
    object(stdClass)#5 (2) {
      ["file_id"]=>
      string(3) "322"
      ["name"]=>
      string(13) "322 is better"
    }
    [2]=>
    object(stdClass)#6 (2) {
      ["file_id"]=>
      string(3) "323"
      ["name"]=>
      string(11) "323 is best"
    }
    [0]=>
    object(stdClass)#4 (2) {
      ["file_id"]=>
      string(3) "321"
      ["name"]=>
      string(11) "321 is good"
    }
  }
}
object(ArrayObject)#1 (1) {
  ["storage":"ArrayObject":private]=>
  array(3) {
    [2]=>
    object(stdClass)#6 (2) {
      ["file_id"]=>
      string(3) "323"
      ["name"]=>
      string(11) "323 is best"
    }
    [0]=>
    object(stdClass)#4 (2) {
      ["file_id"]=>
      string(3) "321"
      ["name"]=>
      string(11) "321 is good"
    }
    [1]=>
    object(stdClass)#5 (2) {
      ["file_id"]=>
      string(3) "322"
      ["name"]=>
      string(13) "322 is better"
    }
  }
}
object(ArrayObject)#1 (1) {
  ["storage":"ArrayObject":private]=>
  array(3) {
    [0]=>
    object(stdClass)#4 (2) {
      ["file_id"]=>
      string(3) "321"
      ["name"]=>
      string(11) "321 is good"
    }
    [1]=>
    object(stdClass)#5 (2) {
      ["file_id"]=>
      string(3) "322"
      ["name"]=>
      string(13) "322 is better"
    }
    [2]=>
    object(stdClass)#6 (2) {
      ["file_id"]=>
      string(3) "323"
      ["name"]=>
      string(11) "323 is best"
    }
  }
}
object(ArrayObject)#1 (1) {
  ["storage":"ArrayObject":private]=>
  array(3) {
    [0]=>
    object(stdClass)#4 (2) {
      ["file_id"]=>
      string(3) "321"
      ["name"]=>
      string(11) "321 is good"
    }
    [1]=>
    object(stdClass)#5 (2) {
      ["file_id"]=>
      string(3) "322"
      ["name"]=>
      string(13) "322 is better"
    }
    [2]=>
    object(stdClass)#6 (2) {
      ["file_id"]=>
      string(3) "323"
      ["name"]=>
      string(11) "323 is best"
    }
  }
}

-@Wrikken,是的,
$sort
将在运行中定义,感谢您让我尝试您的代码…我没有测试过它,因此我对任何解析或其他错误不负责,但它应该有助于理解您的想法;)-@Wrikken,那么我是否需要先将
$obj
键入$array?另外,我在返回重新订购的
$obj
时遇到问题。我只是这样做:
$obj=usort($obj,函数)($a.
?-@wrikken,我很困惑,这不是将
名称
文件ID
一起保存。而且,
321
总是排在第一位,你介意澄清你的答案来解决这两个问题吗?谢谢,啊哈,我现在才看到你的“行列表”本身就是一个对象,第一次就错过了。是的,要进行排序,您需要一个数组(或者为
迭代器
接口定义一个自定义的
next()
&其他),或者扩展类似
ArrayObject
(这就是我在本例中所做的)。