Я пытаюсь взять две записи из таблицы и сравнить их, чтобы определить, что можно рассматривать как конфликт слияния, что нужно игнорировать, а что можно автоматически объединить без конфликтов.
У меня есть таблица клиентов, и я хотел бы сделать следующее:
Я хотел бы взять эту информацию и передать ее в представление, где я могу показать элементы управления, чтобы позволить пользователю решать, что делать.
Я придумал следующее, но я не очень хорошо разбираюсь в функциях массива PHP и мог бы использовать что-то лучше или эффективнее?
$results = [];
foreach ($client_first as $key => $value){
if (empty($value) && empty($client_second[$key])) {
$results['ignore'][] = $key;
} elseif (!empty($value) && empty($client_second[$key])) {
$results['merged'][$key] = $value ? $value : $client_second[$key];
} elseif (empty($value) && !empty($client_second[$key])) {
$results['merged'][$key] = $value ? $value : $client_second[$key];
} elseif (!empty($value) && !empty($client_second[$key])) {
$results['conflicts'][] = $key;
}
}
Я не женат на вышесказанном. Так что любые предложения приветствуются.
Два массива будут что-то вроде:
Первый массив:
array:8 [
first_name => "John"last_name => "Doe"middle_initial => null
email => null
cell_phone => null
education_level => null
gender => "Male"race => "White"]
Второй массив:
array:8 [
first_name => "Johnn"last_name => "Does"middle_initial => null
email => null
cell_phone => null
education_level => null
gender => null
race => null
]
И я ожидаю увидеть:
array:3 [
"conflicts" => array:2 [
0 => "last_name"1 => "first_name"]
"ignore" => array:4 [
0 => "middle_initial"1 => "email"2 => "cell_phone"3 => "education_level"]
"merged" => array:2 [
"gender" => "Male""race" => "White"]
]
Входные данные:
$a1=[
'first_name' => "John",
'last_name' => "Doe",
'middle_initial' => null,
'email' => null,
'cell_phone' => null,
'education_level' => null,
'gender' => "Male",
'race' => "White"];
$a2=[
'first_name' => "Johnn",
'last_name' => "Does",
'middle_initial' => null,
'email' => null,
'cell_phone' => null,
'education_level' => null,
'gender' => null,
'race' => null
];
Метод:
$result=["conflicts"=>[],"ignore"=>[],"merged"=>[]];
foreach($a1 as $k=>$v){
if($v==$a2[$k]){ // no change, ignore
$result["ignore"][]=$k;
}elseif(is_null($v)){ // yes change, 1st is null, use 2nd
$result["merged"][$k]=$a2[$k];
}elseif(is_null($a2[$k])){ // yes change, 2nd is null, use 1st
$result["merged"][$k]=$v;
}else{ // neither are null, user decides
$result["conflicts"][]=$k;
}
}
var_export($result);
Выход:
array (
'conflicts' =>
array (
0 => 'first_name',
1 => 'last_name',
),
'ignore' =>
array (
0 => 'middle_initial',
1 => 'email',
2 => 'cell_phone',
3 => 'education_level',
),
'merged' =>
array (
'gender' => 'Male',
'race' => 'White',
),
)
Кроме того, вы можете хранить фактические конфликты, используя:
$result["conflicts"][]=["field"=>$k,"firstvalue"=>$v,"secondvalue"=>$a2[$k]];
в остальном блоке. Это даст вам подмассив конфликтов, подобный этому:
'conflicts' => array (
0 => array (
'field' => 'first_name',
'firstvalue' => 'John',
'secondvalue' => 'Johnn',
),
1 => array (
'field' => 'last_name',
'firstvalue' => 'Doe',
'secondvalue' => 'Does',
)
)
Эта структура хранения данных может помочь вам настроить пользовательский интерфейс.
Других решений пока нет …