【问题标题】:Foreach loop from array and how to contain it来自数组的 Foreach 循环以及如何包含它
【发布时间】:2017-09-08 02:19:10
【问题描述】:

我已经为这个问题苦苦挣扎了一个星期了,我别无选择,只能在 stackoverflow 中问一个问题。

我目前正在使用 PHP Spout 读取 xlsx 文件的行,数组看起来像这样

Array
(
  [Name] => abcd1234
  [Address] => abcd1234
  [Number] => abcd1234
)
Array
(
  [Name] => abcd1234
  [Address] => abcd1234
  [Number] => abcd1234
)
Array
(
  [Name] => abcd1234
  [Address] => abcd1234
  [Number] => abcd1234
)

foreach 循环如下所示

// Number of sheet in excel file
foreach ($reader->getSheetIterator() as $sheet) {

    // Number of Rows in Excel sheet
    foreach ($sheet->getRowIterator() as $row) {

        // It reads data after header. In the my excel sheet, 
        // header is in the first row. 
        if ($count1 > 1) { 

            // Data of excel sheet
            $data['Name'] = $row[0];
            $data['Address'] = $row[1];
            $data['Number'] = $row[2];

            //Here, You can insert data into database. 
            //print_r($data);
            //$sql = mysqli_query($connection, "INSERT INTO address(Name, Address, Number) VALUES ('$row[0]', '$row[1]', '$row[2]')");
                foreach ($data as $key => $value) {
                    $value = trim($value); 
                        if (empty($value)){
                        echo $output = "Row ".$count1." Column ".$key." is empty <br/>";
                        }
                }
        }
        $count1++;
    }
}

我有一个问题,我需要循环所有数组并在我设法做的每一列上找到缺失的行,现在我需要忽略或计算行上的重复值。我尝试做 array_unique 但它不适用于我正在使用的数组。

我也尝试将我的数组插入另一个数组,但我也遇到了插入问题。我可能在声明我的数组时遇到问题,但我仍然遇到一些问题。如何忽略多个不同数组上的重复项,或者如何将所有单独的数组合并到一个 foreach 循环内的一个数组中?对不起,我对 php 中的数组有点陌生,如果有人正在阅读这篇文章,谢谢。

编辑:我的目标是计算 xlsx 文件中数组/行中缺失值的数量。这就像示例代码中的 foreach 循环一样。示例:

Row 213 Column Name is empty 
Row 214 Column Name is empty 
Row 214 Column Address is empty 

这就是我在 xlsx 文件的行中回显缺失值时的样子。

现在我需要验证 xlsx 文件是否有重复行。我最初的想法是要么回显具有重复值的行,即

Row 213 Column Name is has duplicates
Row 214 Column Name is has duplicates
Row 214 Column Address is empty 

但是一切都变得复杂了,这导致我尝试使用 array_unique,但也遇到了问题,因为 xlsx 文件呈现数组的方式。

【问题讨论】:

  • 您要寻找的输出/结果是什么?你能举个例子吗?您应该考虑使用准备好的语句,而不是将数据直接粘贴到 SQL 查询中。如果我没记错的话,getRowIterator 可以让您指定起始行,因此您不必使用$count1
  • 您好,感谢您的回复。我用一个例子编辑了这个问题。

标签: php arrays excel foreach


【解决方案1】:

根据对您问题的评论中的建议,使用准备好的陈述。

至于您的问题的解决方案,当 SQL 查询执行并成功插入数据时,将唯一标识符添加到数组中。在将新数据插入数据库之前,请检查唯一标识符是否已经在插入值的数组中。我在我的手机上,否则我会提供一个例子。但这应该会有所帮助。

【讨论】:

  • 您好,感谢您的回复。我会尝试阅读准备好的陈述,看看我能做些什么。
【解决方案2】:

我希望这会让你继续前进:

$data = array();
foreach ($sheet->getRowIterator($startRow = 2) as $row) {
    $data[] = array('Name' => $row[0], 'Address' => $row[1], 'Number' => $row[2])
}
$names = array_column($data, 'Name');
$addresses = array_column($data, 'Address');
$numbers = array_column($data, 'Number');

$unique_names = array_unique($names);
$unique_addresses = array_unique($addresses);
$unique_numbers = array_unique($numbers);

$dup_names = array_diff($names, $unique_names);
$dup_addresses = array_diff($names, $unique_addresses);
$dup_numbers = array_diff($names, $unique_numbers);

一旦您开始插入数据库,以下是您如何使用准备好的语句:

$stmt = $connection->prepare("INSERT INTO address(Name, Address, Number) VALUES (?, ?, ?)");
foreach ($data as $row) {
    $stmt->bind_param('sss', $row['Name'], $row['Address'], $row['Number']);
    $stmt->execute();
}

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2015-02-15
    • 1970-01-01
    • 2021-03-02
    • 2020-11-13
    相关资源
    最近更新 更多