мне нужна помощь в написании логики 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 записи похожи на других, но направление мл не всегда двунаправленным. иногда, например, когда s1 = 6, значение ml равно 1, однако, когда s1 = 1, нет значения ml.
Условие 2: Снова просто для объяснения записей мл, посмотрите выше и ниже, где s1 = 5 (выше) и где s1 = 2 + rec = 5 (ниже), этот скрипт должен понять, что уже существует s1 за его значение и что он должен быть добавлен там.
Условие 3: Обратите внимание, что при s1 = 2, ml = 3 это сохраняется, но когда s1 = 3, ml = 2, это игнорируется, потому что у нас есть обратная запись.
Я в основном хочу сопоставить все данные в 1 отсортированный «профиль», поэтому он попадает в следующий формат, который я буду хранить в другой таблице db «отсортированных» записей.
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();
}
Так что я получил это далеко - теперь мне это нужно, чтобы сделать сортировку и я действительно застрял. eeeek – Andrew