Я намеренно хочу использовать текстовый файл для этого. Поэтому я читаю текстовый файл и хочу проверить, существует ли имя пользователя в этом текстовом файле или нет, и я хочу либо добавить это имя пользователя в текстовый файл, если он не существует, либо просто добавить точки к нему.
Мой текущий код:
<?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 часа, но не получил никакого решения. Я понятия не имею об этой проблеме.
Это должно работать для вас:
Первое использование 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)
);
Также, если вы хотите получить ТОП 10 пользователей, просто rsort()
ваш массив, а затем взять array_slice()
из первых 10 элементов, например
rsort($usernames);
$topUsers = array_slice($usernames, 0, 10);
print_r($topUsers);
Чтобы заставить \ n работать, используйте PHP_EOL, как в другом ответе
$txt = $username."|".$points.PHP_EOL;
Чтобы обновить найденного в текстовом файле пользователя, перейдите по следующей ссылке
Как заменить конкретную строку в текстовом файле с помощью PHP?
вы должны использовать PHP_EOL вместо «\ n», что также зависит от вашей ОС
$txt = $username."|".$points.PHP_EOL;
для проверки userName просто используйте:
//this works because $file is String because of fread()
if (strpos($file,$username) !== false) {
echo 'user exists';
}
для замены вам понадобится регулярное выражение или использование позиции strpos (которая возвращает позицию имени в строке) и продвижение указателя на счетчик ($ username) +1 и поиск оттуда новой строки, вся эта строка между ними, замена на новые точки
Попробуйте использовать preg_match:
$file = fopen("score.txt", "r");
while (!feof($file)) {
preg_match("/^$username|(.*?)$/", $file, $array);
var_dump($array);
}
но я думаю, что лучше использовать MySQL 🙂