如何在遍历两个数组时防止重复输出


how to prevent duplicate outputs when looping through two arrays

我试图一次遍历两个数组。第一个数组包含标题,第二个数组包含用户通过表单输入的数据。然后将这些值设置为PDF文件。我遇到的问题是输出被重复了两次。

电流输出

first name user input
first name user input
last name user input
last name user input

我想要的输出

first name john
last name  smith

var dump

array(3) { ["fname"]=> string(5) "dkdkd" ["lname"]=> string(3) "kdk" ["submit"]=> string(6) "Submit" } array(3) { ["fname"]=> string(5) "dkdkd" ["lname"]=> string(3) "kdk" ["submit"]=> string(6) "Submit" } array(3) { ["fname"]=> string(5) "dkdkd" ["lname"]=> string(3) "kdk" ["submit"]=> string(6) "Submit" } array(3) { ["fname"]=> string(5) "dkdkd" ["lname"]=> string(3) "kdk" ["submit"]=> string(6) "Submit" } 

代码
<?php require('fpdf.php');?>
<?php
$headings = [
    "first_name" => "first Name",
    "last_name" => "last Name",
];
if(isset($_POST['submit'])) {
    $pdf = new FPDF();
    $pdf->AddPage();
    foreach ($headings as &$value) {
        foreach ($_POST as $key => $data) {
            if($key == 'submit') {
                continue;
            }    
            $pdf->SetFont('Arial','B',16);
            $pdf->write(40,"$value");
            $pdf->write(40,"$data");
            $pdf->ln(10);
        }
    }
    $pdf->Output();
}
?>

首先,这是意料之外的行为,因为第二个循环应该重复为名、姓、名、姓。(明白我的意思)。

$heading = ['first name', 'last name'];

上面的代码片段显示数组中有2个条目。因此,您的内部foreach()循环将重复两次,因为它被包装在其中。更好的理解:

foreach(... as ...) // 2 entries
   foreach(... as ...) // 3 entries that will be repeated twice ^

你可以使用带有计数器的数组索引来实现。

$i = 0; // index start at 0
foreach($_POST as $k => $v) {
    if($k == "submit") continue;
    $pdf->write(40, $heading[$i++]);
    $pdf->write(40, $v);
    [...]
}

希望这有助于你的复制问题。
tldr:看到它在这里工作

你可以这样做:

$duplicate = array();
foreach ($... as $...):
    if (in_array($...., $duplicate))
    continue; //if we already have that id, skip it
    $duplicate[] = $...;
endforeach