Показать, что может быть объединено, пусто и существует в одном массиве

Я пытаюсь взять две записи из таблицы и сравнить их, чтобы определить, что можно рассматривать как конфликт слияния, что нужно игнорировать, а что можно автоматически объединить без конфликтов.

У меня есть таблица клиентов, и я хотел бы сделать следующее:

  • клиент один и клиент два пусты — игнорировать
  • один клиент имеет данные — хорошо, чтобы объединить в один
  • у обоих клиентов есть данные — пусть пользователь решает

Я хотел бы взять эту информацию и передать ее в представление, где я могу показать элементы управления, чтобы позволить пользователю решать, что делать.

Я придумал следующее, но я не очень хорошо разбираюсь в функциях массива 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"]
]

1

Решение

Входные данные:

$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',
)
)

Эта структура хранения данных может помочь вам настроить пользовательский интерфейс.

0

Другие решения

Других решений пока нет …