14

PHPには2つの配列があります。最初の配列($ author_array)は、次のように特定の順序でuser_idsで構成されます:(8、1、6)

2番目の配列($ user_results)は、次のようなオブジェクトの配列で構成されています。

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [user_login] => user1
        )
    [1] => stdClass Object
        (
            [ID] => 6
            [user_login] => user6
        )
    [2] => stdClass Object
        (
            [ID] => 8
            [user_login] => user8
        )
)

(8、1、6)の最初の配列の値の順序と一致するこの順序になるように、2番目の配列を「ソート」したいと思います。したがって、次のようになります。

Array
(
    [0] => stdClass Object
        (
            [ID] => 8
            [user_login] => user8
        )
    [1] => stdClass Object
        (
            [ID] => 1
            [user_login] => user1
        )
    [2] => stdClass Object
        (
            [ID] => 6
            [user_login] => user6
        )
)

私はデータ構造が苦手です。どうすればこれを行うことができますか?:-)

よろしくお願いします!

-ボブ

4

4 に答える 4

29

usortを使用して、「順序付け」配列内のキーの位置を使用してソート順を決定するカスタム比較関数を提供します。たとえば、次のようになります。

function cmp($a, $b) 
{
   global $author_array;

   $pos1=array_search ($a->ID, $author_array);
   $pos2=array_search ($b->ID, $author_array);

   if ($pos1==$pos2)
       return 0;
   else
      return ($pos1 < $pos2 ? -1 : 1);

}


usort($user_results, "cmp");
于 2008-12-10T10:06:20.790 に答える
3

これが他の例よりも大幅に遅くなるかどうかはわかりませんが、より単純に見えます。ID をキーとして使用して、最初に $user_results 配列を連想配列として作成すると、簡単にルックアップを行うことができます。

$hash = array();
$result = array();

foreach ($user_results as $obj) {
    $hash[$obj->ID] = $obj;
}

foreach ($author_array as $id) {
    $result[] = $hash[$id];
}
于 2008-12-10T10:11:57.783 に答える
1

同様の問題がありましたが、配列でオブジェクトを注文しようとしていました(それはオブジェクトではありませんでした)。それは不可能なので、私の回避策は次のとおりです。

$sort_array= array(11, 4, 16, 19, 23);
$myobject = sort_categories($myobject)

function cmp($a, $b) { 
    if ($a->sort_key == $b->sort_key) { return 0; }
    return ($a->sort_key < $b->sort_key) ? -1 : 1;
}
function sort_categories($obj) {
    global $sort_array;

    foreach($obj as $cat) {
        $cat->sort_key = 999;
        for ($i=0;$i<count($sort_array);$i++) {
            if ($sort_array[$i] == $cat->term_id) $cat->sort_key = $i;
        }
    }
    usort($obj,'cmp');
    return $obj;
}

オブジェクトを調べて、「sort_key」と呼ばれる新しい (プロパティ?) を追加します。これを使用して、usort() と cmp() で並べ替えます。デフォルトでは、新しい sort_key は 999 になるため、最後にスタックします。

于 2011-02-26T22:09:27.810 に答える
0
public static function reorganizeBykey ($objects, array $keys){
    $results = array();
    foreach($keys as $key){
        $i=0;
        foreach($objects as $object){
            if($object->sourceName==$key){
                $results[$i] = $object;
            }
            $i++;
        }
    }
    $others = (array_diff_assoc($objects,$results));
    $results = array_merge($results,$others);
    return $results;
}

これがお役に立てば幸いです。これを使用して並べ替えを行い、最後に一致しないものを追加する必要がありましたarray()keys()

于 2012-04-20T22:15:46.473 に答える