我希望有一个数组,如果它有重复,则将索引和值移动到第五个计数。并使用字段值,无论值是整数还是字母数字。
这是一个想法:
<?php
$array = array(
array('value' => 1),
array('value' => **2**),
array('value' => **2**), //Move this
array('value' => **2**), //Move the also second duplicate
array('value' => A),
array('value' => B),
array('value' => C),
array('value' => 6),
array('value' => **7**),
array('value' => **7**), //Move this
array('value' => 8),
array('value' => 9),
array('value' => 10),
array('value' => 11)
);
?>
我想将值5和7移动到每五次迭代。
这一定是结果。
<?php
$array = array(
array('value' => 1),
array('value' => **2**),
array('value' => A),
array('value' => B),
array('value' => C),
array('value' => **2**), //Move to fifth array, row
array('value' => 6),
array('value' => **7**),
array('value' => 8),
array('value' => **2**), //Move to the fifth array if has second duplicate
array('value' => 9),
array('value' => 10),
array('value' => **7**), //Move to fifth array, row
array('value' => 11)
);
?>
我在几周内遇到了麻烦。这有可能的代码吗?任何人都可以帮助我吗?
答案 0 :(得分:1)
我不确定我是否100%理解这个问题,但以下代码会产生所需的输出:
$lastvalue= null;
$toinsert= null;
$insertcount= 0;
$insertindex= -1;
$result= array();
for($ndx=0;$ndx<count($array);$ndx++)
{
$value= $array[$ndx]['value'];
if ($value==$lastvalue)
{
// It's a duplicate, set the insert index
$insertindex= $ndx+4; // 4 places on from here (5 from the first occurrence)
// Store the value we want to duplicate
$toinsert= $array[$ndx];
$insertcount++;
}
elseif(isset($toinsert) && $value==$toinsert['value']) {
// We're already dealing with one of these, add this to the count to be
// inserted
$insertcount++;
}
else
{
if ($ndx==$insertindex)
{
// We've reached the insertindex, insert our duplicate(s)
for($i=0;$i<$insertcount;$i++)
{
$result[]= $toinsert;
}
$insertcount= 0;
}
$result[]= $array[$ndx];
$lastvalue= $value; // Store this value so we can check for duplicates in the next iteration
}
}
print_r($result);
基本上我所做的就是遍历原始数组寻找重复。如果找到重复,则记下重复值并计算应该插入该值的索引(当前索引+4 - 这是重复原始出现时的5次迭代!)。当它到达该索引时,它会将存储的值插入到结果中。
请注意,如果在找到第一组重复项之前找到第二组重复项(它将放弃第一个重复项并使用第二个重复项),则此方法无效。如果在到达插入点之前到达原始数组的末尾,它也不会重新插入副本。
这有帮助吗?
编辑已更新,可以处理多个连续重复项。它是通过保持计数到达$insertindex
时需要插入的记录数来实现的。
注意:此代码现在变得有点丑陋 - 它可能是其他已经建议更好地适应多重复制方案的答案之一。
答案 1 :(得分:1)
这是一个适合您的功能。它会查找相同的记录,然后将它们移动到正确的位置。
<?php
$array = array(
array('value' => 1),
array('value' => 2),
array('value' => 2),
array('value' => "A"),
array('value' => "B"),
array('value' => "C"),
array('value' => 6),
array('value' => 7),
array('value' => 7),
array('value' => 8),
array('value' => 9),
array('value' => 10),
array('value' => 11)
);
function spaceIdenticalRecords(&$array){
for ($i=1; $i < count($array); $i++) {//loop through the array
if($array[$i]['value'] === $array[$i - 1]['value']){//look for records that match
$replace = array_merge(array_slice($array, ($i+1), 3),array($array[$i]));//move the mathing record down 4
array_splice($array, $i, 4, $replace);//place back in the array
}
}
}
spaceIdenticalRecords($array)
var_dump($array);
?>
编辑: 此更新的功能应该能够处理任意数量的相同数字。
function spaceIdenticalRecords(&$array){
for ($i=1; $i < count($array); $i++) {//loop through the array
if($array[$i]['value'] === $array[$i - 1]['value']){//look for records that match
for ($j= $i + 1; $j < count($array); $j++){
if($array[$j] !== $array[$i]) break;
}
if ($j+4 > count($array)){
$length = count($array) - $j -1;
}else{
$length = $j - $i + 2;
}
$replace = array_merge(array_slice($array, $j, 3),array($array[$i]));//move the mathing record down 4
for ($k = count($replace); count($replace) < $length +1; $k++){$replace = array_merge($replace,array($array[$i]));}
array_splice($array, $i, count($replace), $replace);//place back in the array
$i--; //don't miss records!
}
}
}
答案 2 :(得分:1)
这是您的解决方案
<?php
$array = array(
array('value' => 1),
array('value' => 2),
array('value' => 2),
array('value' => "A"),
array('value' => "B"),
array('value' => "C"),
array('value' => 6),
array('value' => 7),
array('value' => 7),
array('value' => 8),
array('value' => 9),
array('value' => 10),
array('value' => 11)
);
$required_array = array();
$temp = "";
foreach($array as $key=>$child) {
if($child["value"]==$temp) {
$i = $key+4;
$required_array[$i] = $child;
} else {
$i = $key;
if(isset($required_array[$key])) $i++;
$required_array[$i] = $child;
}
$temp = $child["value"];
}
ksort($required_array);
print_r($required_array);
?>
修改强>
以下代码应该适用于2个以上的重复
$required_array = array();
$temp = "";
foreach($array as $key=>$child) {
if($child["value"]==$temp) {
$i = $key+4;
$required_array[$i] = $child;
} else {
$i = $key;
//if(isset($required_array[$i])) $i++; // Removed this line
while(isset($required_array[$i])) { //added this line
$i++; //added this line
} //added this line
$required_array[$i] = $child;
}
$temp = $child["value"];
}
ksort($required_array);
print_r($required_array);