2015-01-21 58 views
0

我需要帮助写PHP脚本这种种数据成某种格式的逻辑...分组相似的记录与PHP

首先脚本需要遍历每个S1值和平安端点得到毫升值(更像),实际上是引用其他s1记录。这是简单的部分!数据是这样返回的;

Table 1 
s1 | ml 
---------- 
1 | - 
2 | 3,4  
3 | 2,8,9 
4 | - 
5 | 2 
6 | 1 
7 | 10 
8 | - 
9 | - 
10 | - 

条件1:正如你所看到的S1值,告诉它其他S1记录类似于其他的端点返回数据,但M1的方向并不总是双向的。有时候,就像当s1 = 6时ml的值是1但是当s1 = 1时没有ml值。这个脚本需要意识到已经存在一个可以解释ml记录的上下文,其中s1 = 5(上面),其中s1 = 2 + rec = 5(下面) s1记录它的价值,它应该被添加在那里。注意s1 = 2时,ml = 3时如何存储,但当s1 = 3时,ml = 2,因为我们有反向记录,所以忽略它。

我基本上想要将所有数据匹配到1个排序'配置文件',所以它最终以下面的格式,我将存储在'排序'记录的另一个数据库表。

Table 2 
s1 | rec 
---------- 
2 | 3 
2 | 4 
2 | 8 
2 | 9 
2 | 9 
2 | 5 
6 | 1 
7 | 10 

这已经绞尽脑汁了几天,现在,我需要的东西,这就是有效的,因为最终它会处理数百万条记录,我敢肯定有一个简单的解决方案,但我只是想不出如何启动它。

我尝试了以下,但我卡住了,不知道如何走得更远;

public function getrelated($id='', $t=''){ 

    if($id != ""){ 
    $get = Easytest::where('s1','=',$id)->get(); 

     if(count($get) > 0){ 
      $ret= array(); 
      foreach($get as $go){ 
        $v = explode(",", $go->s2); 

        foreach ($v as $e) { 
         if($e != $t){ 
          $ret[$e] = $this->getrelated($e, $id); 
         } 
        } 
       } 
       if(count($ret) > 0){ 
        return $ret; 
       }else{ 
        return ""; 
       } 

     }else{ 
       return $id; 
     } 
    }else{ 
     return ""; 
    } 

    } 

public function easytest(){ 
    ob_start(); 
    $a = array(
       array("s1"=>1,"s2"=>implode(",",array()).""), 
       array("s1"=>2,"s2"=>implode(",",array(3,4)).","), 
       array("s1"=>3,"s2"=>implode(",",array(2,8,9)).","), 
       array("s1"=>4,"s2"=>implode(",",array()).""), 
       array("s1"=>5,"s2"=>implode(",",array(2)).","), 
       array("s1"=>6,"s2"=>implode(",",array(1)).","), 
       array("s1"=>7,"s2"=>implode(",",array(10)).","), 
       array("s1"=>8,"s2"=>implode(",",array()).""), 
       array("s1"=>9,"s2"=>implode(",",array()).""), 
       array("s1"=>10,"s2"=>implode(",",array()).""), 
       array("s1"=>11,"s2"=>implode(",",array(12)).","), 
       array("s1"=>12,"s2"=>implode(",",array(2)).",") 
       ); 

    //return Easytest::insert($a); 

    $records = Easytest::all(); 

    foreach ($records as $record) { 

     $id = $record->s1; 
     echo "ROW: ".$id." > "; 
     $record->s2 = ltrim($record->s2,","); 
     $ml = explode(",",$record->s2); 
     if(count($ml) >= 1){ 
      foreach ($ml as $t) { 

       echo "RESULT: ".$t." -".print_r($this->getrelated($t, $id), true); 
       echo ",\n"; 

      } 
     } 
     echo " <br><br>\n\n"; 

    } 

    return ob_get_clean(); 

} 
+0

所以我走了这么远 - 现在我需要做的排序和我真正卡住了。 eeeek – Andrew 2015-01-21 17:21:04

回答

0

好的,所以我最终解决了这个问题......实际上这是下面的代码; 改进欢迎:)

您需要调用的函数,像这样

related(array('searched'=>array(),'tosearch'=>array(13))); 

功能:

public function related($input){ 


    $searched = $input['searched']; 

    $ar = array(); 
    $bits = array(); 

    if(count($input['tosearch']) != 0){ 

     $get = Easytest::orWhere(function($query) use ($input) 
         { 
          foreach ($input['tosearch'] as $k=>$v) { 
            $query->orWhere('s2', 'LIKE', '%,'.$v.',%')->orWhere('s1', '=', $v); 
           }      
         }) 
      ->orderBy('s1', 'ASC')->get(); 

      foreach ($input['tosearch'] as $k=>$v) { 
           unset($input['tosearch'][$k]); 
           $input['searched'][$v] = $v; 
       } 


      foreach ($get as $result) { 

       $thesebits = explode(",", trim($result->s2,",")); 
       foreach ($thesebits as $smallbit) { 
        if($smallbit != ""){ 
        $bits[] = $smallbit; 
        } 
       } 

       $bits[] = $result->s1; 
       $bits = array_unique($bits); 

       foreach ($bits as $k=>$v) { 
         if(($key = array_search($v, $input['searched'])) == false) { 
           $input['tosearch'][$v] = $v; 
         }else{ 
          unset($input['tosearch'][$v]); 
         } 

       } 

       $input['tosearch'] = array_unique($input['tosearch']); 

      } 
      return $this->related($input); 
    }else{ 
     return $input; 
    } 

}