[英]Is there a way to remove all repeated keys except the last one in array?
我有從服務器收到的消息數組,其中包含用戶看到消息的鍵see_by ,它的結構:
[1] => Array
(
[seen_by] => Array
(
[1] => user_1
[2] => user_2
[3] => user_3
)
)
[2] => Array
(
[seen_by] => Array
(
[2] => user_2
[3] => user_3
)
)
[3] => Array
(
[seen_by] => Array
(
[3] => user_3
)
)
他們在seen_by數組中的鍵是 user_id,
我想要做的是因為 user_2 已經在第二條消息的seen_by數組中,所以將其從第一個seen_by數組中刪除,並且由於 user_3 在第三條消息的seen_by數組中,從前兩條消息中刪除
我想得到像
[1] => Array
(
[seen_by] => Array
(
[1] => user_1
)
)
[2] => Array
(
[seen_by] => Array
(
[2] => user_2
)
)
[3] => Array
(
[seen_by] => Array
(
[3] => user_3
)
)
我已經簡化了 arrays 以進行說明,但顯示了這個想法。 您可以從最后開始循環遍歷 arrays 並向后工作,刪除以后 arrays 中存在的元素。
$array = array(
array( 1, 2, 3 ),
array( 2, 3 ),
array( 3 ),
);
$len = count( $array );
for ( $i = $len -1 ; $i > 0; $i-- ) {
$curr_array = $array[ $i ];
for( $j = $i - 1; $j >= 0; $j-- ) {
$array[$j] = array_diff( $array[$j], $curr_array );
}
}
使用 foreach 循環和從最后到第一個循環。 為此,請使用array_reverse()
。 使用$set
檢查是否已使用isset
跟蹤用戶。 如果是,則從當前子數組中unset
它或將其添加到$set
並與下一個元素一起移動。 最后再做一個array_reverse
,只是為了恢復原來的順序。
片段:
<?php
function removeDups($data){
$set = [];
$res = [];
foreach(array_reverse($data) as &$sub){
foreach($sub['seen_by'] as $idx => $val){
if(isset($set[ $val ])){
unset($sub['seen_by'][ $idx ]);
}else{
$set[ $val ] = true;
}
}
$res[] = $sub;
}
return array_reverse($res);
}
print_r(removeDups($data));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.