2017-09-08 6 views
1

私はこの問題を今一週間苦労しています。これ以上のオプションはありませんが、ここでstackoverflowで質問してください。配列からのループとその包含方法

私は現在のxlsxファイルの読み込み行のためのPHPスパウトを使用していますし、アレイは、この

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ループ内の別の配列をすべて1つの配列にマージする方法はありますか?申し訳ありませんが、私は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ファイルが提示されているので、問題を抱えていた複雑ました。

+0

/あなたの出力結果は何探している?多分例を挙げることができますか?データをSQLクエリに直接ペーストするのではなく、プリペアドステートメントを使用することを検討する必要があります。私が間違っていない場合、 'getRowIterator'は開始行を指定できるので、' $ count1'を使う必要はありません。 –

+0

こんにちは、ありがとうございます。私はその例を編集した。 – Junnel

答えて

2

あなたの質問にコメントとして示唆されているように、prepared statementsを使用してください。

問題の解決方法として、SQLクエリが実行され、データが正常に挿入されると、一意の識別子を配列に追加します。新しいデータをデータベースに挿入する前に、一意の識別子が既に挿入された値の配列内にあるかどうかを確認してください。私は私の電話の上にいる、そうでなければ私は例を提供するだろう。しかし、それは助けになるはずです。

+0

こんにちは、ありがとうございます。私は準備文を読んで、私ができることを見てみよう。 – Junnel

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(); 
} 
関連する問題