2012-09-11 50 views
0

我需要transorm對象數組,因此,例如,該數組將只包含1對象其中對象屬性'bar'= b 。Array_udiff對象數組,使數組包含對象,只有一個特定方法的實例存在

所以我想轉:

Array ([0] => stdClass Object ( 
    [id] = 1 
    [foo] => 'a' 
    [bar] => 'b') 

    [1] => stdClass Object ( 
    [id] => 2 
    [foo] => 'a' 
    [bar] => 'c') 

    [2] => stdClass Object ( 
    [id] => 3 
    [foo] => 'y' 
    [bar] => 'b') ) 

到:

 Array ([0] => stdClass Object ( 
    [id] = 1 
    [foo] => 'a' 
    [bar] => 'b') 

    [1] => stdClass Object ( 
    [id] => 2 
    [foo] => 'a' 
    [bar] => 'c') 

不過,我需要這在更大的範圍內工作,所以我難倒就如何結合array_filter, array_udiff和array_slice來得到我想要的。我在想,array_filter會讓我所有的鑰匙在'foo' = 'b'。然後,我可以將這個數組和array_udiff與原始數據對齊,以獲取'foo'=! 'b'中的項目。然後,我可以從array_filter中分割匹配以獲得單鍵數組...並將其與array_udiff差異合併。

$matches = array_filter($array, "bar_filter"); 

$remainder = array_udiff($array, $matches, 'compare_objects'); 

$single = array_slice($matches, 0, 1); 

$result = array_merge($single, $remainder); 

function foobar_filter($obj) { 
    if ($obj->bar == 'b') { 
     return true; 
    } else { 
     return false; 
    } 
} 

function compare_objects($obj_a, $obj_b) { 
    return $obj_a->id = $obj_b->id; 
} 

我compare_objects功能關閉肯定的,但我不知道要放什麼東西在那裏。僅僅運行第二個array_filter來獲取不匹配的項目會更好嗎?我需要把陣列分成鍵,其中'bar'='b'並在'bar'!='b'和只有1名對象,其中'bar'='b'

+0

那麼你將有兩個數組,一個充滿具有屬性'欄== B'對象和其他填充具有屬性的對象'吧!= B',然後你想將這兩個數組合併到一個數組中,它將只包含一個帶有'bar == b'屬性的對象..對嗎? – dbf

+0

當你這樣說...; /但是,這就是我的意思。 – helgatheviking

+0

我只是試圖重述你的問題,我不諷刺;)..在第二代碼和平它說**成**,我也看到一個對象,其中'[酒吧] = C',所以我猜猜這不是最終結果?有沒有關於這個對象的具體內容,可以如何用'bar == b'從其餘的所有內容中選擇它? – dbf

回答

0

好了,所以爲了清楚起見,我會做一個循環回到一起合併。

$matches = array(); 
$remainder = array(); 

// $index if you need to maintain index=>object relation 
foreach($array as $index => $object) { 
    if($object->bar == "b") 
    $matches[] = $object; 
    else 
    $remainder[] = $object; 
} 

- for循環

for($index=0,$count=count($array);$index<$count;$index++) { 
    if($object->bar == "b") 
    $matches[] = $array[$index]; 
    else 
    $remainder[] = $array[$index]; 
} 

-

,那麼你想結果與第一指數$matches

$result = array_merge(array($matches[0]),$remainder); 

合併。如果是這樣的話,那麼你只需要改變比較對象的主體,這應該做的過濾殘留的竅門摹對象了

return $obj_a->id == $obj_b->id ? 0 : 1; 
+0

foreach循環比array_filter快嗎?或者這是嚴格的清晰度?好像你不再需要compare_object函數。另外,你在變量名中有一些拼寫錯誤...我試圖糾正它們,但是沒有足夠的字符讓我編輯。 – helgatheviking

+0

儘管'array_filter'和'array_udiff'實際上是原生函數,可能會變得更快,但它們必須迭代最大的數組,總共需要兩次。 – dbf

+0

錯別字已離開,對不起;) – dbf

相關問題