Имя файла json в котором найдено значение

makc0993

Всем привет,
есть папка с файлами json, в каждом файле одинаковые ключи, но разные значения.
Как найти 1 файл в котором есть значение указанное в $_POST и вывести его имя?

И как сделать более оптимизировано, файлов может быть несколько тысяч

 

Drunkenmunky

По очереди считывать, преобразовывать, искать

Загрузить в базу данных. Если версия MySQL 5.7 и выше, то можно каждый JSON в отдельную ячейку.
Если ниже, то придется разобрать по ключам и значениям, и ID json.

 

makc0993

PHP:
  1. <?php
  2. $nickname = $_POST[«nickname»];
  3. $check = 0;
  4. $arr = scandir(«/home/servers/», 1);
  5. foreach ($arr as $value) {
  6.  
  7.     $string= file_get_contents(«/home/public_html/servers/$value«);
  8.     $array = json_decode($string, true);
  9.     if (in_array($nickname, $array)) {
  10.         $check = 1;
  11.         echo $value;
  12.         break;
  13.     }
  14.     }
  15.  
  16. if ($check == 0)
  17. {
  18.     echo ‘0’;
  19. }
  20. ?>

примерно так? ошибку выдает на строчке чтения file_get_contents. Путь правильный, я сократил

 

Drunkenmunky

Кто ж его знает что у вас там массиве.

После строки 4 вставьте print_r($arr);
И посмотрите что вам scandir() выдает.

 

makc0993

через echo проверял, пришла в ответ строка из имен всех файлов в папке servers

 

Drunkenmunky

Давайте примеры json, и что искать.

 

makc0993

я же код выложил и все описал.
найти значение $nickname во всех файлах из папки servers, если нашел останавливаем поиск и высылаем ответ.
Какие примеры?

 

Drunkenmunky

В первую очередь структуры массива в виде json.
in_array() ищет значение в одномерном массиве.

 

makc0993

понял, после работы посмотрю, но это не имеет значения так как ошибка в другой строке, до in_array еще добраться нужно

 

roboformation

Как ты в echo впихнул массив?

PHP:
  1. $nickname = $_POST[«nickname»];
  2. $check = 0;
  3. $arr = scandir(«/home/servers/», 1);
  4. print_r ($arr);
  5. foreach ($arr as $value) {
  6.     $string= file_get_contents(«/home/public_html/servers/$value«);
  7.     $array = json_decode($string, true);
  8.     if (in_array($nickname, $array)) {
  9.         $check = 1;
  10.         echo $value;
  11.         break;
  12.     }
  13.     }
  14. if ($check == 0)
  15. {
  16.     echo ‘0’;
  17. }

Сделай так и посмотри на массив. 2 последних элемента там случайно не точки?

 

makc0993

хз, как я вчера вывел массив сонный был, но сегодня уже не получается :D
print нет у меня только echo, долго разбираться ссылку искать и т.п. запрос через приложение
— Добавлено —
вот что внутри json
[{«Language»:»RU»,»DefaultServer»:true,»Server»:»S1″,»NickName»:»ооооо=оо6оо»,»Lvl»:»1″}]

 

roboformation

Текст ошибки можешь привести?

 

Drunkenmunky

И что искать?

 

makc0993

вспомнил, я в foreach добавил
echo $value; и он мне все имена вывел и в конце ошибку выдает

здесь куча имен файлов json потом это
Notice: file_get_contents(): read of 8192 bytes failed with errno=21 Is a directory in /home/findloginplayer.php on line 7<br />
..<br />
Notice: file_get_contents(): read of 8192 bytes failed with errno=21 Is a directory in /home/findloginplayer.php on line 7<br />

походу в конце массива что-то лишнее может как раз таки точки
— Добавлено —

в post я ввожу значение никнейма
в ответ имя файла json c этим ником

 

Drunkenmunky

PHP:
  1. <?php
  2. $jstr = ‘[{«Language»:»RU»,»DefaultServer»:true,»Server»:»S1″,»NickName»:»ооооо=оо6оо»,»Lvl»:»1″}]’;
  3. //$find   = ‘»NickName»:»ооооо=оо6оо»‘;
  4. $find = sprintf(‘»NickName»:»%s»‘, $_POST[‘find’]);
  5.  
  6. if(strpos($jstr, $find))
  7. {
  8. echo ‘found’;
  9. }
  10. else
  11. {
  12. echo ‘not found’;
  13. }
  14. ?>
 

roboformation

PHP:
  1. $nickname = $_POST[«nickname»];
  2. $check = 0;
  3. $arr = array_diff(scandir(«/home/servers/», 1), [«..», «.»] ) ;
  4. print_r ($arr);
  5. foreach ($arr as $value) {
  6.     $string= file_get_contents(«/home/public_html/servers/$value«);
  7.     $array = json_decode($string, true);
  8.     if (in_array($nickname, $array)) {
  9.         $check = 1;
  10.         echo $value;
  11.         break;
  12.     }
  13.     }
  14. if ($check == 0)
  15. {
  16.     echo ‘0’;
  17. }

Ошибка ушла?

 

makc0993

ошибка ушла, но поиск не работает, возвращает 0

по соседству есть скрипт с аналогичным поиском, работает прекрасно, а здесь почему то нет

 

roboformation

Попробуйте «if (in_array($nickname, $array))» заменить на «if (in_array($nickname, $array [0]))

 

makc0993

всегда возвращает имя первого файла

 

Drunkenmunky

Нужно вывести все имена файлов с встречающимся никнеймом или с первым найденным?

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *