Burning Hippo
Burning Hippo

Reputation: 805

PHP - CSV to table not converting as expected

I am trying to create SQL INSERT statements from a CSV file. I have successfully opened and read the file. I have even output the file in a table format. However, the alterations I do in the for loop such as when $c == 0 do not work. It just outputs to the table exactly as it was in the csv file. That is what I am trying to change! To keep with that example, I am trying to make the name "John Doe" be "john" and "Doe". The CSV file has the names as one and I'd like to split into first and last.

Also, the phone numbers aren't changing either. The code to change them begins with $c == 5. The funny thing is when I put them into here: http://ideone.com/HfGXJk It works fine.

<?php

fgetcsv_PHP();

function fgetcsv_PHP()
{
if (($handle = fopen("guests.csv", "r")) !== FALSE)
{

    $length = 1000;
    $delimiter = ",";

    $fname = array();
    $lname = array();
    $address = array();
    $city = array();
    $state = array();
    $zip = array();
    $phone = array();
    $email = array();

    //print opening table
    echo "<table border='1'>\n";


    while ( ( $data = fgetcsv( $handle, $length, $delimiter ) ) !== FALSE )
    {
        // Count number of array elements in $data
        $num = count($data);

        // Print opening table row HTML tag
        echo "<tr>\n";

        //loop through array
        for ($c=0; $c < $num; $c++)
        {
            if ($c == 0)
            {
                $name = $c;
                $name = explode(" ",$name);
                $first = array_shift($name);
                $last = array_pop($name);
                array_push($fname, $first);
                array_push($lname, $last);
                echo "<td>".$data[$first]."</td>\n";
            }
            if ($c == 1)
            {
                array_push($address, $c);
                echo "<td>".$data[$c]."</td>\n";
            }
            if ($c == 2)
            {
                array_push($city, $c);
                echo "<td>".$data[$c]."</td>\n";
            }
            if ($c == 3)
            {
                array_push($state, $c);
                echo "<td>".$data[$c]."</td>\n";
            }
            if ($c == 4)
            {
                array_push($zip, $c);
                echo "<td>".$data[$c]."</td>\n";
            }
            if ($c ==5)
            {
                $phnum = $c;
                $phnum = preg_replace('~[^0-9]~','',$phnum);
                array_push($phone, $phnum);
                echo "<td>".$data[$phnum]."</td>\n";
            }
            if ($c == 6)
            {
                array_push($email, $c);
                echo "<td>".$data[$c]."</td>\n";
            }
        }

        // Print closing table row HTML tag
        echo "</tr>\n";
    }

    // Print close table HTML tag
    echo "</table>";

    // Close the file pointed to by $handle
    fclose($handle);
}
}
?>

Upvotes: 0

Views: 173

Answers (2)

ThW
ThW

Reputation: 19492

The part reading the name, sets $name to 0, explodes it at the non existing space, puts the 0 from the first element of the array (from the explode) in $first and outputs $data[$first] meaning $data[0] - the original value.

Refactored to PHP 5.5:

$file = new SplFileObject('guests.csv', 'r');
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(',', '"');

$converter = function($traversable) {
  foreach ($traversable as $data) {
    list($first, $last) = explode(' ', $data[0]);
    $address = $data[1];
    $city = $data[2];
    $state = $data[3];
    $zip = $data[4];
    $phone = preg_replace('([^\d])', '', $data[5]);
    $email = $data[6];

    $result = array(
      'first' => $first,
      'last' => $last,
      'address' => $address,
      'city' => $city,
      'state' => $state,
      'zip' => $zip,
      'phone' => $phone,
      'email' => $email,
    );
    yield $result;
  }
};

foreach ($converter($file) as $data) {
  var_dump($data);
} 

Upvotes: 1

user1864610
user1864610

Reputation:

The code you posted to the other site is not the code you posted here. If that works, fine. It has little to do with this:

if ($c ==5)
{
    $phnum = $c;
    $phnum = preg_replace('~[^0-9]~','',$phnum);
    array_push($phone, $phnum);
    echo "<td>".$data[$phnum]."</td>\n";
}

Look at $phnum. The first thing you do is set it to $c, i.e 5. Then you remove all the non-numeric characters in 5, push the result onto an array which you don't appear to use, and output $data[$phnum], i.e. $data[5], your original data.

Upvotes: 1

Related Questions