2008-12-10 201 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()进行排序,然后追加什么不匹配结尾。