解决方案 »

  1.   

    充填失败的比例是由 C1、C2 列的分布决定的,既然两列的值已经存在,那么我们可以找出这些失败的行
    至于需要控制失败的比例,那是不可能的,因为你不能去修改原始数据
    找出失败的行的思路是:将 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
            ))
      

  2.   


    <?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个错误 
      

  3.   


    忽然想到修改了下这部分,发现可以完美结果,但算法应该还不是最优……
    $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个错误 
      

  4.   

    我来给个方法
    一开始全是0 所以不符合数是9
    第一轮:
    第0行 a=0 c=0 不符合 给a-1 c+1
    第1行 给a+1
    ...计算下不符合数 比上一次大就结束  否则继续这样的话
    a c
    c a 
    这种循环型的估计永远是2了...