2017-05-17 3 views
1

J'essaie de prendre deux enregistrements d'une table et de les comparer pour déterminer ce qui pourrait être considéré comme un conflit de fusion, ce qui doit être ignoré, et ce que peut être fusionné automatiquement sans conflit.Montrer ce qui pourrait être fusionné, est vide, et existe dans un tableau

J'ai une table de clients et que vous souhaitez effectuer les opérations suivantes:

  • client un client et deux sont vides - ignorer
  • un client dispose de données - ok pour se fondre dans un
  • les clients avoir des données - laisser l'utilisateur décider

Je voudrais prendre cette information et la passer à une vue où je peux montrer des contrôles pour laisser l'utilisateur décider quoi faire.

Je suis venu avec ce qui suit, mais je ne suis pas très bon avec les fonctions de tableau de PHP et pourrait être en mesure d'utiliser quelque chose de mieux ou plus efficace?

$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; 
    } 
} 

Je ne suis pas marié à ce qui précède. Donc, toutes les suggestions seraient les bienvenues.

Les deux tableaux seraient quelque chose comme:

Premier tableau:

array:8 [ 
    first_name => "John" 
    last_name => "Doe" 
    middle_initial => null 
    email => null 
    cell_phone => null 
    education_level => null 
    gender => "Male" 
    race => "White" 
] 

tableau Second:

array:8 [ 
    first_name => "Johnn" 
    last_name => "Does" 
    middle_initial => null 
    email => null 
    cell_phone => null 
    education_level => null 
    gender => null 
    race => null 
] 

Et j'attendre à voir:

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

Veuillez fournir quelques tableaux d'entrée pertinents, puis afficher la sortie souhaitée pour chaque tableau d'entrée. Cela nous aidera à vous assurer que vous utilisez les fonctions "correctes" pour comparer les données (* hint - empty() est une petite âme gourmande: http://php.net/manual/fr/function.empty.php) – mickmackusa

+0

Merci @mickmackusa J'ai mis à jour ma question. – EspressoD

Répondre

0

Entrée:

$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 
]; 

Méthode:

$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); 

Sortie:

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

En outre, vous pouvez stocker les conflits réels en utilisant:

$result["conflicts"][]=["field"=>$k,"firstvalue"=>$v,"secondvalue"=>$a2[$k]]; 

dans le bloc else. Cela vous donnera un conflit sous-tableau comme ceci:

'conflicts' => array (
    0 => array (
     'field' => 'first_name', 
     'firstvalue' => 'John', 
     'secondvalue' => 'Johnn', 
    ), 
    1 => array (
     'field' => 'last_name', 
     'firstvalue' => 'Doe', 
     'secondvalue' => 'Does', 
    ) 
) 

Cette structure de stockage de données peut vous aider à configurer l'interface utilisateur.

+0

Merci monsieur. Cela semble être ce dont j'ai besoin. – EspressoD