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:

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

Open in new window

The resulting data.txt file has multiple lines like this:

John Smith
Sam Johnson
Steve Jones

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?
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.


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
array_map(function($v) { return explode(' ', $v); }, file('data.txt'));

Open in new window

PHP < 5.3
array_map(create_function('$val', 'return explode(" ", $val);'), file('data.txt'));

Open in new window

Hopefully this helps!
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:
$return = explode(' ', implode(' ', array_map('trim', file('data.txt'))));

Open in new window

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.

file_put_contents('data.txt', json_encode($_POST));

Open in new window

Then for reading the data:

$data = json_decode(file_get_contents('data.txt'));

Open in new window

Although not essentially part of the answer, just thought I would throw this out there.

Happy Coding.
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

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.
shampouyaAuthor Commented:
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.
You got it right. The >>array_map('trim', ...<< is to remove the new line at the end of each element.

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
shampouyaAuthor Commented:
Thanks a lot, very easy to understand explanation.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.