shampouya
asked on
How do I turn a txt file with multiple lines into a php array with the explode function?
I have a form on my website that adds user inputs to a file called data.txt. Here is the php code that the form triggers:
The resulting data.txt file has multiple lines like this:
John Smith jsmith@email.com
Sam Johnson sjohnson@email.com
Steve Jones sjones@email.com
I want to use some php to turn every word, separated by spaces, into an array element in $wordArray like this:
$fh = fopen("data.txt", 'r') or die("can't open file");
$wordArray = explode(" ",fgets($fh));
But the " \n" at the end of the $email variable makes it impossible for me to access the strings on the following line correctly. For example, $wordArray[3] should be "Sam" but it's not. Any idea what I'm doing wrong?
<?php
$myFile = "data.txt";
$fh = fopen($myFile, 'a') or die("can't open file");
$firstName = $_POST["firstName"]." ";
fwrite($fh, $firstName);
$lastName = $_POST["lastName"]." ";
fwrite($fh, $lastName);
$email = $_POST["email"]." \n";
fwrite($fh, $email);
fclose($fh);?>
The resulting data.txt file has multiple lines like this:
John Smith jsmith@email.com
Sam Johnson sjohnson@email.com
Steve Jones sjones@email.com
I want to use some php to turn every word, separated by spaces, into an array element in $wordArray like this:
$fh = fopen("data.txt", 'r') or die("can't open file");
$wordArray = explode(" ",fgets($fh));
But the " \n" at the end of the $email variable makes it impossible for me to access the strings on the following line correctly. For example, $wordArray[3] should be "Sam" but it's not. Any idea what I'm doing wrong?
The script above would create a multidimensional array. Even if this is what most want, you asked for something different.
This should do what you asked for:
Another advice, space is not the best separator, because it can appear in names. Something like comma or semicolon would be better. Additional, the file creating function should filter out this letter - i.e. fwrite($fh, str_replace(';', '', $_POST['firstname']) . ';');
This should do what you asked for:
$return = explode(' ', implode(' ', array_map('trim', file('data.txt'))));
Another advice, space is not the best separator, because it can appear in names. Something like comma or semicolon would be better. Additional, the file creating function should filter out this letter - i.e. fwrite($fh, str_replace(';', '', $_POST['firstname']) . ';');
I agree with the above comment (It looks like I overlooked the way in which he wanted to access his data), although I don't agree with the latter part of your answer. It would make more sense to account for more than just the space character. Also, we should remove the need for a delimiter to prevent issues with the heuristic. For instance the below code would be the most reliable in my opinion in this given instance.
Then for reading the data:
Although not essentially part of the answer, just thought I would throw this out there.
Happy Coding.
file_put_contents('data.txt', json_encode($_POST));
Then for reading the data:
$data = json_decode(file_get_contents('data.txt'));
Although not essentially part of the answer, just thought I would throw this out there.
Happy Coding.
Firstly instead of writting to the file one by one build a string and add that to file as a line.
Explicitly put space before and after each of the element excluding first one and last one .
Some thing like this.
$line = $_POST["firstName"]." ".$_POST["lastName"]." ".$_POST["email"]." \n";
and then add this line to the file
fwrite($fh, $line);
Besides its always better to use a visible delimiter like ',' to avoid problem like your.
Explicitly put space before and after each of the element excluding first one and last one .
Some thing like this.
$line = $_POST["firstName"]." ".$_POST["lastName"]." ".$_POST["email"]." \n";
and then add this line to the file
fwrite($fh, $line);
Besides its always better to use a visible delimiter like ',' to avoid problem like your.
ASKER
acbxyz, your solution is the most understandable to me. So, can you double check that my understanding on what's going on below is correct? First, the file() function is opening the data.txt file and putting each line into an array. Then the array_map() function is applying the trim function to each element of the array we just made using file(). Then, every line is imploded, or fused together, and separated by spaces to make one long line. Then, the long line we just made is exploded into 9 different elements separated by spaces. Is my understanding correct?
$return = explode(' ', implode(' ', array_map('trim', file('data.txt'))));
btw, I will take your advice and change the spaces to semicolons.
$return = explode(' ', implode(' ', array_map('trim', file('data.txt'))));
btw, I will take your advice and change the spaces to semicolons.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks a lot, very easy to understand explanation.
Using the file method you can read a file into an array line by line. From there you can separate each line similar to how your doing it. For instance:
PHP >= 5.3
Open in new window
PHP < 5.3
Open in new window
Hopefully this helps!