У меня есть текстовый файл с большим количеством данных. Я дошел до извлечения имен полей между символьными операторами.
Я хотел бы, чтобы мой код сканировал ВЕСЬ текстовый файл. по какой-то причине он останавливается с первым появлением символов / строки.
<?PHP
//First, open the file. Change your filename
$file = "datafile1.txt";
$handle = fopen($file, "r");
$contents = fread($handle, filesize($file));
for ($i=0; $i=100; $i+10){
$word1='"cat_id';
$word2='"category"';
$a = strpos($contents, $word1);
$b = strpos($contents, $word2);
$between=substr($contents, $a, ($b - $a));
echo $between;
//////////////////////////////////
$word1='"category';
$word2='"name"';
$c = strpos($contents, $word1);
$d = strpos($contents, $word2);
$between=substr($contents, $c, ($d - $c));
echo $between;
////////////////////////////////////
$word1='"name';
$word2='"description"';
$e = strpos($contents, $word1);
$f = strpos($contents, $word2);
$between=substr($contents, $e, ($f - $e));
echo $between;
}
fclose($handle);
?>
Я получил возврат
«cat_id»: «16349», «category»: «Adventure», «name»: «Черный флаг Assassin’s Creed IV — Xbox 360»,
но это останавливается там, где есть повторяющиеся cat_id и категории, а также имена … ну, компьютерные игры.
Мне нужно отсканировать весь текстовый файл, чтобы поиск повторялся, надеюсь, получится список из результатов игр и категорий.
* редактировать: извините. Вот пример файла данных, который нужно проанализировать.
"cat_id": "16349",
"category": "Adventure",
"name": "Assassin's Creed IV Black Flag - Xbox 360",
"description": "It is 1715. Pirates rule the Caribbean and have es... (visit site URLs for full description)",
"updated_at": 1419672679,
"width": "139.70",
"sem3_id": "1AEIvknN7uwqG2GcwSCMK8",
"created_at": 1374830955,
"platform": "Xbox 360",
"height": "12.70",
"length": "190.50",
"sitedetails": [
{
"sku": "B00BMFIXT2",
"latestoffers": [
{
"seller": "JNJ Shop",
"lastrecorded_at": 1419672600,
"currency": "USD",
"firstrecorded_at": 1419672600,
"id": "7g2fpY7BOSE0sU2oKkUkeY",
"price": "11.00",
"shipping": "3.99",
"condition": "New"},
200 lines later.....
"cat_id": "20923",
"category": "Games",
"name": "Disney Infinity Starter Pack - PlayStation 3",
"description": "Product Description Platform: PlayStation 3 | Edit... (visit site URLs for full description)",
"updated_at": 1419563879,
"width": "269.24",
"created_at": 1375817329,
"sem3_id": "0FIqEyeRf4SMgiYaoKC6yO",
"platform": "PlayStation 3",
"height": "90.93",
"length": "358.39",
"sitedetails": [
{
"sku": "7635065",
"latestoffers": [
{
"seller": "BestBuy",
"lastrecorded_at": 1419552600,
"firstrecorded_at": 1419015000,
"currency": "USD",
"availability": "In stock",
"price": "66.98",
"id": "5EefaVFIhs2UKYA0Q0qIae",
"condition": "New"},
Это на самом деле не останавливается.
Каждый раз, когда вы кормите там один и тот же контент, и в соответствии с http://php.net/manual/en/function.strpos.php вы должны получить то же вхождение указанного вами текста.
Возможно, вам придется использовать третий параметр [, int $ offset = 0], чтобы указать, с чего начать на следующей итерации. Что-л. лайк:
$a = 0;
$b = 0;
for ($i=0; $i=100; $i+10){
$word1='"cat_id';
$word2='"category"';
$a = strpos($contents, $word1, $a);
$b = strpos($contents, $word2, $b);
Если вы собираетесь использовать одни и те же слова «cat_id» и «category», инициируйте их вне своих итераций.
для перехвата всех случаев лучше использовать циклы while:
$catWord = '"cat_id"';
$categoryWord = '"category"';
$a = 0;
$b = 0;
while (($a = strpos($content, $catWord, $a)) !== false) {
$b = strpos($content, $categoryWord, $b);
$between = ....
Других решений пока нет …