Php 数组中的Foreach循环以及如何包含它
我已经为这个问题挣扎了一个星期了,我别无选择,只能在stackoverflow这里问一个问题 我目前正在使用PHP Spout读取xlsx文件的行,数组如下所示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
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();
}