我正在研究一个过滤多维数组的函数,如果连续的数组具有相同的值,则需要删除它们之间的数组,并仅获取具有重复值的连续数组的第一个和最后一个。
我不知道该怎么做。
希望你能帮助我。
谢谢。
示例代码
function removeDuplicates($array){
$result = [];
$count = 0;
$firstValue = null;
for ($i = 0; $i < count($array); $i++) {
if($array[$i]['id'] == firstValue){
$result[] = $array[$i]);
}else{
// do action
}
}
return $array;
}
样本数组
Array (
[0] => Array (
[key] => 0
[value] => 25
)
[1] => Array (
[key] => 1
[value] => 25
)
[2] => Array (
[key] => 2
[value] => 25
)
[3] => Array (
[key] => 3
[value] => 33
)
[4] => Array (
[key] => 4
[value] => 45
)
[5] => Array (
[key] => 5
[value] => 66
)
[6] => Array (
[key] => 6
[value] => 66
)
[7] => Array (
[key] => 7
[value] => 66
)
[8] => Array (
[key] => 8
[value] => 66
)
[9] => Array (
[key] => 9
[value] => 55
)
)
这里的前3个数组具有相同的值(25),我需要删除第2个数组并保留第1个和第3个数组,第6个到第9个数组仅保留第6个和第9个数组。
预期结果
Array (
[0] => Array (
[key] => 0
[value] => 25
)
[2] => Array (
[key] => 2
[value] => 25
)
[3] => Array (
[key] => 3
[value] => 33
)
[4] => Array (
[key] => 4
[value] => 45
)
[5] => Array (
[key] => 5
[value] => 66
)
[8] => Array (
[key] => 8
[value] => 66
)
[9] => Array (
[key] => 9
[value] => 55
)
)
答案 0 :(得分:1)
尝试一下:
$array = [
["key" => 0, "value" => 25],
["key" => 1, "value" => 25],
["key" => 2, "value" => 25],
["key" => 3, "value" => 33],
["key" => 4, "value" => 45],
["key" => 5, "value" => 66],
["key" => 6, "value" => 66],
["key" => 7, "value" => 66],
["key" => 8, "value" => 66],
["key" => 9, "value" => 55],
];
for ($i = 0; $i < count($array); $i++) {
if (!isset($array[$i])){
continue;
}
if ($array[$i]['value'] == $array[$i+1]['value']) {
$j = 1;
while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
unset($array[$i+$j]);
$j += 1;
}
}
}
print_r($array);
由于您需要保留键,因此当未设置元素时,for循环将引发通知。这就是为什么我们首先检查元素是否存在。
然后,循环查找连续的两个相同值,即$i
和$i+1
。一旦找到它们,它将进入while循环以测试3个或更多连续的相同值。仅当连续项之前和之后至少发生一次时,它才会取消设置连续项。例如,仅当$i+2
相同时,它才会删除$i+3
。
希望这会有所帮助!
答案 1 :(得分:1)
您可以这样处理
$r = [];
$lastKey = '';
foreach($array as $k => $v){
if(in_array($v['value'], array_column($r, 'value'))){
$lastKey = $v['key'];
}else{
if($lastKey && !in_array($lastKey, array_column($r, 'key'))){
end($r);
$r[] = [ 'key' => $lastKey, 'value' => $r[key($r)]['value']];
}
$r[] = [ 'key' => $v['key'] , 'value' => $v['value'] ];
$lastKey = $v['key'];
}
}
答案 2 :(得分:0)
这是解决方案: 您的数组是这样的:
$array = [
["key" => 0, "value" => 25],
["key" => 1, "value" => 25],
["key" => 2, "value" => 25],
["key" => 3, "value" => 33],
["key" => 4, "value" => 45],
["key" => 5, "value" => 66],
["key" => 6, "value" => 66],
["key" => 7, "value" => 66],
["key" => 8, "value" => 66],
["key" => 9, "value" => 55],
];
首先,找到每个值的第一个和最后一个出现。 您需要一个遍历数组并找到确切值的方法。 看这个:
function search($search, $array)
{
foreach ($array as $key => $val) {
if ($val['value'] === $search) {
return $key;
}
}
return null;
}
运行$firstOccurrence = search(25, $array)
将发现25
的第一次出现。
现在,为了找到最后一次出现的索引,我们应该将数组反转为从数组末尾开始的行进。因此$lastOccurrence = search(25, array_reverse($array, true))
将找到25
的最后出现索引。
好的,当我们处理每个值时,因此,我们不应再次处理它。因此,我们需要一个数组来保存要处理的值。
最终代码:
function testArray()
{
$array = [
["key" => 0, "value" => 25],
["key" => 1, "value" => 25],
["key" => 2, "value" => 25],
["key" => 3, "value" => 33],
["key" => 4, "value" => 45],
["key" => 5, "value" => 66],
["key" => 6, "value" => 66],
["key" => 7, "value" => 66],
["key" => 8, "value" => 66],
["key" => 9, "value" => 55],
];
$processedItems = [];
$newArray = [];
foreach ($array as $index => $item) {
if (in_array($item["value"], $processedItems))
continue;
$processedItems[] = $item["value"];
$firstIndex = search($item["value"], $array);
$lastIndex = search($item["value"], array_reverse($array, true));
$newArray[$firstIndex] = $array[$firstIndex];
if ($firstIndex != $lastIndex)
$newArray[$lastIndex] = $array[$lastIndex];
}
print_r($newArray);
}
function search($search, $array)
{
foreach ($array as $key => $val) {
if ($val['value'] === $search) {
return $key;
}
}
return null;
}
答案 3 :(得分:-1)
请尝试这一希望成功
for ($i = 0; $i < count($array); $i++) {
if ($array[$i]['value'] == $array[$i+1]['value']) {
$j = 1;
while ($array[$i]['value'] == $array[$i+$j+1]['value']) {
echo $array[$i]['value'].'==='.$array[$i+$j+1]['value'];
unset($array[$i+$j]);
$j += 1;
}
}
}