0

$objこのforeach()ループの後にオブジェクトがあるとしましょう。

foreach($obj as $row){
    echo 'file_id:'.$row->file_id.'-name:'.$row->name.'<br>';
}

このようになります:

file_id:321-name:321-is-good
file_id:322-name:322-is-better
file_id:323-name:323-is-best

最初の'd$objを選択できるように並べ替えるにはどうすればよいですか?たとえば、どこかに接続すると、結果は次のようになります。echo$row322

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()が、私は何をする必要があるかについて頭を包むことができません。

考え?

ありがとう、ティム

4

1 に答える 1

2

特定の開始時に並べ替えたいと仮定してfile_id、前に来るものを追加します。これも並べ替えられfile_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);
 });

配列の代わりにオブジェクトを使用した作業例:

<?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"
    }
  }
}

于 2012-06-16T02:20:27.727 に答える