Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组中的Foreach循环以及如何包含它_Php_Arrays_Excel_Foreach - Fatal编程技术网

Php 数组中的Foreach循环以及如何包含它

Php 数组中的Foreach循环以及如何包含它,php,arrays,excel,foreach,Php,Arrays,Excel,Foreach,我已经为这个问题挣扎了一个星期了,我别无选择,只能在stackoverflow这里问一个问题 我目前正在使用PHP Spout读取xlsx文件的行,数组如下所示 Array ( [Name] => abcd1234 [Address] => abcd1234 [Number] => abcd1234 ) Array ( [Name] => abcd1234 [Address] => abcd1234 [Number] => abcd12

我已经为这个问题挣扎了一个星期了,我别无选择,只能在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++;
    }
}
这就是我从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查询执行并成功插入数据时,将唯一标识符添加到数组中。在将新数据插入数据库之前,请检查唯一标识符是否已在插入值数组中。我在打电话,否则我就举个例子。但这应该会有所帮助

我希望这会让你走上正轨:

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

您想要的输出/结果是什么?你能举个例子吗?您应该考虑使用准备好的语句,而不是将数据直接粘贴到SQL查询中。如果我没有弄错的话,
getroweiterator
允许您指定起始行,这样您就不必使用
$count1
。您好,谢谢您的回复。我用一个例子编辑了这个问题。嗨,谢谢你的回答。我会试着仔细阅读准备好的声明,看看我能做些什么。
$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();
}