如何检查文件中是否已存在用户名并将其积分添加给他?

时间:2015-07-23 12:25:28

标签: php file fwrite fread

我故意想用文本文件来做这件事。所以我读了一个文本文件,我想检查该文本文件中是否已经存在用户名,如果他不存在,我想将该用户名添加到文本文件中,或者只是将点添加给他。

我目前的代码:

<?php
$myfile = fopen("test.txt", "r") or die("Unable to open file!");
$file = fread($myfile,filesize("test.txt"));
//echo $file;
fclose($myfile);

//$username = $_REQUEST['username'];
//$points = $_REQUEST['point'];
$username = 'chinmay'; //chinmay is a username this is unique
$points = 200; //if username chinmay not exitst then Insert first time otherwise if username chimay exist then next onwards this point will update everytime in the text file.

$myfileWrite = fopen("test.txt", "a") or die("Unable to open file!");
$txt = $username."|".$points."\n";
fwrite($myfileWrite, $txt);

fclose($myfileWrite);
?> 

的test.txt:

chinmay|800
john|200
sanjib|480
debasish|541

这是我的完整代码。我的要求是:

    当我使用插入同一行的此文本时,
  • \n无效。
  • 如何查看重复的用户名?
  • 如果我找到了用户名,那么我该如何更新用户点?

我用谷歌搜索了2个小时,但没有得到任何解决方案。我不知道这个问题。

4 个答案:

答案 0 :(得分:2)

这应该适合你:

首先使用file()将文件读入数组。然后,您可以使用array_map()遍历每一行,explode()将其作为分隔符|。在此之后,您可以使用array_column()获取用户名作为值的关键值。像这样:

Array
(
    [chinmay] => 1200
    [john] => 200
    [sanjib] => 480
    [debasish] => 541
    [chinmayx] => 200
)

使用数组,您只需检查用户名是否已存在。如果没有将它添加到数组中,然后将点添加到它。

将点数添加到用户名后,您可以使用相同的格式更改数据,并使用file_put_contents()保存。

完整代码:

<?php

    $lines = file("test.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $usernames = array_column(array_map(function($v){
        return explode("|", $v);
    }, $lines), 1, 0);

    $username = "chinmayx";
    $points = 200; 

    if(!isset($usernames[$username]))
        $usernames[$username] = 0;
    $usernames[$username] += $points;

    foreach($usernames as $k => $v)
        $data[] = "$k|$v" . PHP_EOL;

    file_put_contents("test.txt", $data);

?>

修改

如果您的PHP低于5.5,则只需替换:

$usernames = array_column(array_map(function($v){
    return explode("|", $v);
}, $lines), 1, 0);

用这个:

$lines = array_map(function($v){
    return explode("|", $v);
}, $lines);

$usernames = array_combine(
    array_map(function($v){
        return $v[0];
    }, $lines),
    array_map(function($v){
        return $v[1];
    }, $lines)
);

此外,如果您想获得前十名用户,只需rsort()您的阵列,然后选择前10个元素中的array_slice(),例如

rsort($usernames);
$topUsers = array_slice($usernames, 0, 10);
print_r($topUsers);

答案 1 :(得分:0)

你应该使用PHP_EOL而不是&#34; \ n&#34;这也取决于你的操作系统

$txt = $username."|".$points.PHP_EOL;

用于检查userName,只需使用:

//this works because $file is String because of fread()
if (strpos($file,$username) !== false) {
    echo 'user exists';
}

替换你需要正则表达式或使用strpos位置(它返回字符串中name的位置)并按指数($ username)+1推进指针并从那里搜索换行符,这之间的所有字符串,用新点替换

答案 2 :(得分:0)

要使\ n正常工作,请使用另一个答案中的PHP_EOL

$txt = $username."|".$points.PHP_EOL;

要更新文本文件中的用户,请通过以下链接

how to replace a particular line in a text file using php?

答案 3 :(得分:0)

尝试使用preg_match:

$file = fopen("score.txt", "r");

while (!feof($file)) {
preg_match("/^$username|(.*?)$/", $file, $array);
var_dump($array);
}

但我认为使用MySQL会更好:)