if($index1>$index2){ unset($AK[$index1]); array_splice($AK,$index2,0, array($v2['C1'])); } } } }结果 C1 O1 O2 C2 a 1 6 c e 0 1 a a 1 4 b d 5 6 c g 2 3 y d 5 7 t b 4 8 n a 1 9 r y 3 4 b 0个错误
我来给个方法 一开始全是0 所以不符合数是9 第一轮: 第0行 a=0 c=0 不符合 给a-1 c+1 第1行 给a+1 ...计算下不符合数 比上一次大就结束 否则继续这样的话 a c c a 这种循环型的估计永远是2了...
至于需要控制失败的比例,那是不可能的,因为你不能去修改原始数据
找出失败的行的思路是:将 C1、C2 的值作为权,构造一个权重数组。并使 C2 的值在 C1 的前面
对于你示例的数据$ar = array(
array('C1' => 'a', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
array('C1' => 'e', 'C2' => 'a', 'O1' => 0, 'O2' => 0),
array('C1' => 'a', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
array('C1' => 'd', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
array('C1' => 'g', 'C2' => 'y', 'O1' => 0, 'O2' => 0),
array('C1' => 'd', 'C2' => 't', 'O1' => 0, 'O2' => 0),
array('C1' => 'b', 'C2' => 'n', 'O1' => 0, 'O2' => 0),
array('C1' => 'a', 'C2' => 'r', 'O1' => 0, 'O2' => 0),
array('C1' => 'y', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
);$dict = array();
foreach($ar as $v) {
if(! in_array($v['C2'], $dict)) $dict[] = $v['C2'];
if(! in_array($v['C1'], $dict)) {
$n = array_search($v['C2'],$dict);
array_splice($dict, $n, 0, $v['C1']);
}
}
$dict = array_flip($dict);$e = array_filter($ar,
function($r) use ($dict) {
return $dict[$r['C2']] < $dict[$r['C1']];
});print_r($dict);
print_r($e);
权重数组Array
(
[e] => 0
[a] => 1
[d] => 2
[c] => 3
[b] => 4
[g] => 5
[y] => 6
[t] => 7
[n] => 8
[r] => 9
)
失败的行Array
(
[8] => Array
(
[C1] => y
[C2] => b
[O1] => 0
[O2] => 0
))
<?php
$a = array(
array('C1' => 'a', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
array('C1' => 'e', 'C2' => 'a', 'O1' => 0, 'O2' => 0),
array('C1' => 'a', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
array('C1' => 'd', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
array('C1' => 'g', 'C2' => 'y', 'O1' => 0, 'O2' => 0),
array('C1' => 'd', 'C2' => 't', 'O1' => 0, 'O2' => 0),
array('C1' => 'b', 'C2' => 'n', 'O1' => 0, 'O2' => 0),
array('C1' => 'a', 'C2' => 'r', 'O1' => 0, 'O2' => 0),
array('C1' => 'y', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
);$AK=array();
foreach ($a as $k=>$v)
{
$index=array_search($v['C2'],$AK);
$index2=array_search($v['C1'],$AK); if($index===false){
$AK[]=$v['C2'];
}
if($index2===false){
array_splice($AK,array_search($v['C2'],$AK),0, array($v['C1']));
}}
//rsort($AK);$err=0;
echo "<table>";
echo "<tr>";
echo "<th width='100'>C1</th>";
echo "<th width='100'>O1</th>";
echo "<th width='100'>O2</th>";
echo "<th width='100'>C2</th>";
echo "<th width='100'></th>";
echo "</tr>";
foreach ($a as $k=>$v)
{
echo "<tr>";
echo "<td>".$v['C1']."</td>"; $v['O1']=array_search($v['C1'],$AK);
$v['O2']=array_search($v['C2'],$AK); echo "<td>".$v['O1']."</td>";
echo "<td>".$v['O2']."</td>"; echo "<td>".$v['C2']."</td>"; if($v['O1']>$v['O2']){
echo "<td>◆</td>";
$err++;
}else{
echo "<td></td>";
}
echo "</tr>";
}echo "</table><br>";echo $err."个错误";?>
结果是
C1 O1 O2 C2
a 1 3 c
e 0 1 a
a 1 4 b
d 2 3 c
g 5 6 y
d 2 7 t
b 4 8 n
a 1 9 r
y 6 4 b ◆1个错误
忽然想到修改了下这部分,发现可以完美结果,但算法应该还不是最优……
$AK=array();
foreach ($a as $k=>$v)
{
$index2=array_search($v['C2'],$AK);
if($index2===false){
$AK[]=$v['C2'];
} $index1=array_search($v['C1'],$AK);
if($index1===false){
array_splice($AK,$index2,0, array($v['C1']));
} if($index1!==false || $index1!==false){
foreach ($a as $k2=>$v2)
{
$index2=array_search($v2['C2'],$AK);
$index1=array_search($v2['C1'],$AK);
if($index1>$index2){
unset($AK[$index1]);
array_splice($AK,$index2,0, array($v2['C1']));
}
}
}
}结果
C1 O1 O2 C2
a 1 6 c
e 0 1 a
a 1 4 b
d 5 6 c
g 2 3 y
d 5 7 t
b 4 8 n
a 1 9 r
y 3 4 b 0个错误
一开始全是0 所以不符合数是9
第一轮:
第0行 a=0 c=0 不符合 给a-1 c+1
第1行 给a+1
...计算下不符合数 比上一次大就结束 否则继续这样的话
a c
c a
这种循环型的估计永远是2了...