我需要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'
那麼你將有兩個數組,一個充滿具有屬性'欄== B'對象和其他填充具有屬性的對象'吧!= B',然後你想將這兩個數組合併到一個數組中,它將只包含一個帶有'bar == b'屬性的對象..對嗎? – dbf
當你這樣說...; /但是,這就是我的意思。 – helgatheviking
我只是試圖重述你的問題,我不諷刺;)..在第二代碼和平它說**成**,我也看到一個對象,其中'[酒吧] = C',所以我猜猜這不是最終結果?有沒有關於這個對象的具體內容,可以如何用'bar == b'從其餘的所有內容中選擇它? – dbf