Let say i want to read a text file using php.
Now my text file contain
User=Test
Age=18
Gender=F
User=Test2
Age=34
Gender=M
and following like that.
Now let say i want to use php to read the text file and find only value of User= and display it.
What is the easiest way to accomplish this?
Thank you.
$filename = "users.txt";
$user_file_array = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
//Now you have an array of each line of the file.
foreach($user_file_array as $user_info) {
if(strpos($user_info, "User=") !== false) {
$users[] = str_replace("User=", "", $user_info);
}
}
The above assumes that each bit of info is on a new line, that User=
is case-sensitive, and that you are okay with looping through whole file. You will get an array returned of just the user names on the right-side of the User=
.
If you want that to be echoed out in a column, either change the bit where the $users array gets built, or add this to the end:
echo implode("
" $users);
You could try fgets() to get a line of the file and substring the beginning to test if it starts with the proper text. There may be easier ways.
chk this code
<?php
$file = "test.txt";
$userArr=array();
$f = fopen($file, "r");
while ( $line = fgets($f) )
{
$lineArr = explode('=',$line);
if($lineArr[0]=='User')
{
echo "User Name: ".$lineArr[1];
echo "<br/>";
$userArr[] = $lineArr[1];
}
}
print_r($userArr);
?>
For more info chk this here
Unless you're looking for a specific value, you're basically going to have to read the whole file in to memory. You could read it line-by-line and output any line that started with "User", like this:
$fp = fopen("test_input.txt","r");
while(! feof($fp)) {
$line = fgets($fp);
if (substr($line,0,5) == "User=") echo substr($line,5);
}
fclose($fp);
If you wanted the information in a more useful form, you could break it up into an array of users. Assuming that each "section" of your file is separated by a double newline, you could do this:
$out = array();
$contents = file_get_contents('test_input.txt');
$blocks = explode("
",$contents);
foreach($blocks as $b)
{
$user = array();
$lines = explode("
",$b);
foreach($lines as $line) {
list($key,$value) = explode("=",$line,2);
$user[$key] = $value;
}
$out[] = $user;
}
//now have an array of user info
foreach($out as $i) echo $i['User'];
Obviously this makes assumptions about your data (such as all lines separated by " " characters), but you get the idea.
<?php
$lines = array();
$file = fopen("sample.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
$i = 0;
while(!feof($file))
{
$i++;
$lines[$i] = fgets($file). "<br />";
}
fclose($file);
$matches = preg_grep("/^User=(.*)/", $lines);
print_r($matches);
?>
Taken from http://php.net/manual/en/function.preg-grep.php, http://www.phpfreaks.com/forums/index.php?topic=213127.0
This may be more than you're looking for, but if you're looking to parse a text file and you're not tied to a specificformat you should use one that php has inbuilt support for. To me the two most obvious options are XML and JSON. IMHO JSON is probably easiest.
In your example the data file might look like this
[
{
'User':'Test',
'Age':18,
'Gender':'F'
},
{
'User':'Test2',
'Age':34,
'Gender':'M'
}
]
The php to read from it would be
contents = file_get_contents($filename);
$contents = utf8_encode($contents);
$m = json_decode($contents);
Now you can work on $m as you would any array
foreach( $m as $user )
{
print $user->User . "
";
}
If you're married to/stuck with the format that you described, then you can try out my code below. It will give you a nice array that you can work with easily. Otherwise, I suggest you take Michael Anderson's advice and switch over to JSON as it will save you time and normalize things a bit.
$rawData = file_get_contents("data.txt");
$users = array();
$tmpUser = array();
foreach ( file("data.txt", FILE_IGNORE_NEW_LINES) as $line ) {
// Blank line denotes the end of a record
if ( empty($line) ) {
$users[] = $tmpUser;
$tmpUser = array();
continue;
}
list($key, $value) = explode("=", $line, 2);
$tmpUser[ strtolower(trim($key)) ] = trim($value);
}
// Add last record
if ( !empty($tmpUser) ) {
$users[] = $tmpUser;
}
print_r($users);
Result
Array
(
[0] => Array
(
[user] => Test
[age] => 18
[gender] => F
)
[1] => Array
(
[user] => Test2
[age] => 34
[gender] => M
)
)
I realize that you asked specifically to be able to get just the user name; however, this is probably more beneficial in the term of whatever you are trying to accomplish.