2008-12-10 204 views
14

我在PHP中有兩個數組。所述第一陣列($ author_array)中以特定順序由user_ids的,像這樣:(8,1,6)在PHP中按特定順序排列對象數組

所述第二陣列($ 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)中的值的順序相匹配。所以它看起來像這樣:

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 
     ) 
) 

我在數據結構上很薄弱。我怎麼能這樣做? :-)

在此先感謝您的幫助!

-Bob

回答

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"); 
+0

爲什麼-1?它演示了OP可能沒有意識到的有效技術,它與其他答案不同,因爲它執行「就地」排序而不是製作原始數組的副本。 – 2008-12-10 11:13:24

3

我不確定這是否會明顯慢於其他示例,但它似乎更簡單。這可能是因爲您可以將$ user_results數組創建爲關聯數組,然後使用ID作爲關鍵字,然後可以輕鬆進行查找。

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

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

foreach ($author_array as $id) { 
    $result[] = $hash[$id]; 
} 
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,所以它在最後被卡住。

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()進行排序,然後追加什麼不匹配結尾。