Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Подскажите по коду.
цитата
06/08/13 в 13:12
 Lexikon

<?php

$file = "data.txt";

$search = 'yana';

$arrFile = file($file);

//print_r($arrFile);

foreach ($arrFile as $value) {

         $arrStr = explode("|", $value);
       if ($arrStr[0] == $search) {
      
       print_r($arrStr);
       }
       else {echo 'error';}

      
      
}

?>


содержание data.txt

anna|text1.1|text1.2|text1.3
yana|text2.1|text2.2|text2.3
elena|tex3.1|text3.2|text3.3
nika|text4.1|text4.2|text4.3


если все верно т.е. $arrStr[0] == $search истина, то выводится не только содержание массива, но и много раз сверху и снизу отображаемого массива слово 'error'
хотя по логике оно должно выводиться только если фальш.
При фальше же выводится сново несколько раз 'error', но уже одной строкой.

Х.з. почему так происходит.
цитата
06/08/13 в 13:31
 Yacc
Lexikon писал:
но и много раз сверху и снизу отображаемого массива слово 'error'

Много это сколько? Если столько же сколько строчек без 'yana' в data.txt, то всё правильно - как написано, так и работает. Чего ты ожидал?
цитата
06/08/13 в 13:38
 Lexikon
Получается идет по всему файлу
читает строку, заносит ее в массив, если нулевое значение не содержит того что я ищу отображается 'error' если находит то что ищу, вывод массив и двигается дальше.

хмм icon_smile.gif
вон оно что, чет я сразу не сообразил.
Нужно тгда как то по другому.
Попробую переделать.
цитата
06/08/13 в 13:39
 pipe
Lexikon писал:
... но и много раз сверху и снизу отображаемого массива слово 'error'

Ну судя по коду, оно будет выводиться каждый раз, когда в строке не найдено "yana".
цитата
06/08/13 в 13:42
 pipe
Lexikon писал:
Нужно тгда как то по другому.
Попробую переделать.

Если ты поиск делаешь, то тебе не нужны эти error вовсе. Просто флаг выставляй, скажем $found=1 если найдено что-то. Если нет, будет значение по умолчанию $found=0 заданное до цикла поиска. В самом конце проверяй флаг, если !=1 пиши error тогда уже.
цитата
06/08/13 в 13:57
 Lexikon
О! спасибо за идею. то что нужно, прошло!!! smail54.gif

вот так сделал


<?php

$file = "data.txt";

$search = 'yana';

$arrFile = file($file);

$found = 0;

//print_r($arrFile);

foreach ($arrFile as $value) {

         $arrStr = explode("|", $value);
       if ($arrStr[0] != $search) continue;
       else
       {
       $found = 1;      
       }
       break;             
}


if ($found == 0) {echo "No found!";}
else {
       echo '<pre>';
       print_r($arrStr);
       echo '</pre>';
}


?>


я решил вставить еще break; чтоб не перебирать всё остальное когда уже найдено то что нужно.
цитата
06/08/13 в 14:43
 ibiz
Lexikon: а почему не используешь http://php.net/array_search ?
там же есть функция интересная:
Код:
<?php
function array_search_i($str,$array){
     foreach($array as $key => $value) {
         if(stristr($str,$value)) return $key;
     }
     return false;
}
?>
цитата
06/08/13 в 15:49
 Lexikon
я с нее начал, но было безрезультатно ибо он искал строго то что я задавал, а у меня строка
anna|text1.1|text1.2|text1.3
при поиске anna не отображалась, вернее ключь этой строки, вот я и обошел это. Сейчас гляну.
Правда незнаю, ускорит ли это работу, или снизит нагрузку. Если особой разницы нет, можно ведь и оставить.

А так, Спасибо!
цитата
06/08/13 в 15:54
 Lexikon
неа, ничего.
Я так понял эта функция тот же array_search, только тут циклом и без регистра.
цитата
06/08/13 в 18:53
 ibiz
ну да, для твоего случая надо чуток поработать над функцией, например такой вариант:
Код:

function array_search_i($str, $array){
      foreach($array as $key => $value) {
            $value_list = explode('|',$value);
            if(stristr($str, $value_list[0])) return $key;
      }
      return false;
}
цитата
06/08/13 в 19:03
 Yacc
Зачем explode?

Код:
if(0 === stristr($str, $value)) return $key;

Или я туплю опять? icon_smile.gif
цитата
06/08/13 в 19:21
 ibiz
Yacc писал:
Зачем explode?

Код:
if(0 === stristr($str, $value)) return $key;

Или я туплю опять? icon_smile.gif


ага, действительно так тоже можно, туплю чота trollface.png
цитата
06/08/13 в 19:31
 AWD
Yacc писал:
Зачем explode?

Код:
if(0 === stristr($str, $value)) return $key;

Или я туплю опять? icon_smile.gif
тогда может лучше stristr($str.'|', $value), а то будет находить y, ya, yan и т.д. хотя, если нужен поиск по первым буквам...


Эта страница в полной версии