Сравнить элементы массива в двух разных структурированных массивах - PullRequest
2 голосов
/ 23 октября 2019

У меня есть 2 различных структурированных массива, и мне нужно найти совпадающие и несовпадающие элементы и результат вывода в таблице. Я нашел подходящие элементы, но у меня проблемы с поиском несовпадающих. Первый массив всегда имеет больше элементов, чем второй. Вот некоторые части 2 массивов:

$sheetData = Array
(
[0] => Array
    (
        [0] => 01008039918
    )

[1] => Array
    (
        [0] => 01008302495
    )

[2] => Array
    (
        [0] => 01008603263
    )

[3] => Array
    (
        [0] => 01008690496
    )

[4] => Array
    (
        [0] => 01008985481
    )

[5] => Array
    (
        [0] => 40020755400
    )

[6] => Array
    (
        [0] => 40032435000
    )

[7] => Array
    (
        [0] => 40231570009
    )

[8] => Array
    (
        [0] => 40309872408
    )

[9] => Array
    (
        [0] => 40311901009
    )

[10] => Array
    (
        [0] => 40353576000
    )


$found = Array
(
[0] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40594677009
        [EXT_ACCOUNT_ID] => 40594677400
    )

[1] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40595693002
        [EXT_ACCOUNT_ID] => 40595693400
    )

[2] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 01008302495
        [EXT_ACCOUNT_ID] => 01008309812
    )

[3] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40690651009
        [EXT_ACCOUNT_ID] => 40690651404
    )

[4] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40625090009
        [EXT_ACCOUNT_ID] => 40625090400
    )

[5] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40708294009
        [EXT_ACCOUNT_ID] => 40708294400
    )

[6] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40499752009
        [EXT_ACCOUNT_ID] => 40499752404
    )

[7] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40604404009
        [EXT_ACCOUNT_ID] => 40604404400
    )

[8] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40425581009
        [EXT_ACCOUNT_ID] => 40425581404
    )

[9] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 40440897009
        [EXT_ACCOUNT_ID] => 40440897408
    )

[10] => Array
    (
        [INDIVIDUAL_PAYMNET_REFNO] => 01008603263
        [EXT_ACCOUNT_ID] => 01008610730
    )

Подробнее о желаемом выводе, если элемент из первого массива находится в INDIVIDUAL_PAYMNET_REFNO, соответствующий EXT_ACCOUNT_ID должен отображаться в таблице, затем после всех найденных совпадающих элементов поместить одинпустая строка, тогда, если элемент из первого массива не найден в INDIVIDUAL_PAYMNET_REFNO, просто скопируйте значение в ту же строку таблицы.

Я нашел совпадающие значения, но я не могу понять, как найти несовпадающие элементы после одной пустой строки, яполучая несколько повторяющихся записей и несколько копий из совпадающих записей, это мой код:

echo"<table class=\"table style=\"max-width: 50%; margin: 0 auto;\">
<thead>
     <tr>                                
             <th>INDIVIDUAL_PAYMNET_REFNO</th>                               
             <th>EXT_ACCOUNT_ID</th>
         </tr>  
</thead>        
<tbody>";                       
foreach ($sheetData as $sheet_key => $sheet_data) { 
    foreach ($found as $found_key => $found_val) {                              
       if ($sheet_data[0] == $found_val['INDIVIDUAL_PAYMNET_REFNO']) {  
          echo "<tr>";
                echo "<td>".$sheet_data[0]."</td>";                                      
                echo "<td>".$found_val['EXT_ACCOUNT_ID']."</td>";
          echo "</tr>";
        }                                                                   
     }
 }  

echo "<tr>";
   echo "<td>"."&nbsp;"."</td>";
   echo "<td>"."&nbsp;"."</td>";
echo "</tr>";

foreach ($sheetData as $sheet_key => $sheet_data) { 
   foreach ($found as $found_key => $found_val) {                               
       if ($sheet_data[0] != $found_val['INDIVIDUAL_PAYMNET_REFNO'] && $found_val['EXT_ACCOUNT_ID'] == $found_val['INDIVIDUAL_PAYMNET_REFNO']) {    
           echo "<tr>";
             echo "<td>".$sheet_data[0]."</td>";
             echo "<td>".$sheet_data[0]."</td>";
           echo "</tr>";
        }                                                                           
    }
 }                  
 echo "<tbody>";
 echo "</table>";

Любое исправление кода выше приветствуется. Thx.

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Не нужно слишком много петли. Сначала преобразуйте массив листов в обычный массив

$sheet_data = [];
foreach ($sheetData as $key => $value) {
    $sheet_data[] = $value[0];
}

Теперь сработали сопоставленные и несопоставленные $ найденные данные:

$matched_elements = [];
$unmatched_elements = [];
foreach ($found as $found_key => $found_val) {
   if (in_array($found_val['INDIVIDUAL_PAYMNET_REFNO'],$sheet_data)) {
     $matched_elements[] = $found_val;
    }
    else {
      $unmatched_elements[] = $found_val;
    }
 }

Теперь вы используете массивы для отображения сопоставленных и несопоставленных данных

foreach ($matched_elements as $found_key => $found_val) {
    echo "<tr>";
          echo "<td>".$found_val[INDIVIDUAL_PAYMNET_REFNO]."</td>";
          echo "<td>".$found_val['EXT_ACCOUNT_ID']."</td>";
    echo "</tr>";
}

Непревзойденные элементы:

foreach ($unmatched_elements as $found_key => $found_val) {
    echo "<tr>";
          echo "<td>".$found_val[INDIVIDUAL_PAYMNET_REFNO]."</td>";
          echo "<td>".$found_val['EXT_ACCOUNT_ID']."</td>";
    echo "</tr>";
}
0 голосов
/ 23 октября 2019

Вы можете сделать $found словарем для исполнения. Вот только демо, вам нужно отформатировать выводимый контент.

$sheetData = array_column($sheetData,null,"INDIVIDUAL_PAYMNET_REFNO");
foreach($array as $value){
    if(isset($sheetData[$value])){
        echo $sheetData[$value]["EXT_ACCOUNT_ID"] . "<br/>";
    }else{
        $notFoundedData[] = $value;
    }
}
echo "<br/>";
foreach($notFoundedData as $value){
    echo $value . "<br/>";
}
0 голосов
/ 23 октября 2019

При поиске несоответствий вы можете использовать array_diff или array_diff_key, где array_diff покажет несоответствия значений, а array_diff_key покажет ключи, что-то вроде этого в качестве примера:

$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");

$result=array_diff($a1,$a2);
print_r($result);

Это даст вам «желтый», потому что это несоответствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...