来自数组的Foreach循环以及如何包含它

时间:2017-09-08 02:19:11

标签: php arrays excel foreach

我一直在努力解决这个问题一周,我没有其他选择,只能在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文件呈现了数组的方式。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我希望这会让你前进:

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