【问题标题】:Compare array elements in two different structured array比较两个不同结构化数组中的数组元素
【发布时间】:2020-02-19 09:26:48
【问题描述】:

我有 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>";

欢迎对以上代码进行任何更正。谢谢。

【问题讨论】:

  • 这个分组不应该在mysql查询中做吗?为了清楚起见,请显示您的准确、所需、渲染的输出。
  • 不幸的是,我只能使用给定的值
  • just copy value to same table row. 是什么意思?
  • 只是在同一行的下一列中复制该 ID 号

标签: php arrays sorting


【解决方案1】:

查找不匹配时,您可以使用array_diffarray_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);

这会给你“黄色”,因为它不匹配。

【讨论】:

  • 我试过了,但这只是数组键的区别
  • @Greedy 你确定不是array_diff_key 你试过了吗? array_diff 仅在值上,array_diff_key 仅在键上。
【解决方案2】:

不需要太多的循环。 首先将您的工作表数组转换为普通数组

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

现在区分匹配和不匹配的 $found 数据:

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

【讨论】:

    【解决方案3】:

    您可以将$found 制作为性能字典。这里只是一个demo,需要对输出内容进行格式化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2017-08-29
      相关资源
      最近更新 更多