Как я могу проверить, существует ли имя пользователя в файле, а также добавить его очки к нему?

Я намеренно хочу использовать текстовый файл для этого. Поэтому я читаю текстовый файл и хочу проверить, существует ли имя пользователя в этом текстовом файле или нет, и я хочу либо добавить это имя пользователя в текстовый файл, если он не существует, либо просто добавить точки к нему.

Мой текущий код:

<?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 часа, но не получил никакого решения. Я понятия не имею об этой проблеме.

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

Другие решения

Чтобы заставить \ n работать, используйте PHP_EOL, как в другом ответе

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

Чтобы обновить найденного в текстовом файле пользователя, перейдите по следующей ссылке

Как заменить конкретную строку в текстовом файле с помощью PHP?

0

вы должны использовать 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 и поиск оттуда новой строки, вся эта строка между ними, замена на новые точки

0

Попробуйте использовать preg_match:

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

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

но я думаю, что лучше использовать MySQL 🙂

0
По вопросам рекламы [email protected]