Доброго времени суток. Второй день ломаю голову и не могу понять где собака порылась. Есть скрипт парсинга *.xls файлов (кусок кода в котором косяк): Код (Text): for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { $row = " ".@implode(" | ", @$data->sheets[0]['cells'][$i]); $sizes = $GLOBALS['db']->select_array_array("mod_conformity_sizes_variants", "uid", array("name", "pid")); $brends = $GLOBALS['db']->select_array_array("mod_conformity_brends_variants", "uid", array("name", "pid")); $size = ""; $brend = ""; $b_pos = ""; if (is_array($data->sheets[0]['cells'][$i])) { foreach (@$data->sheets[0]['cells'][$i] as $item) { $brend = $GLOBALS['db']->sql_fetch_assoc($GLOBALS['db']->sql_query("SELECT `pid`, `name` FROM `mod_conformity_brends_variants` WHERE `name`='".$item."' LIMIT 1")); if ($brend['pid']) { break; } } if(!$size['pid']) { foreach ($brends as $b) { if (strpos($row, $b['name'])) { $brend['pid']=$b['pid']; break; } } } foreach (@$data->sheets[0]['cells'][$i] as $item) { $size = $GLOBALS['db']->sql_fetch_assoc($GLOBALS['db']->sql_query("SELECT `pid`, `name` FROM `mod_conformity_sizes_variants` WHERE `name`='".$item."' LIMIT 1")); if ($size['pid']) { break; } } if(!$size['pid']) { foreach ($sizes as $s) { if (strpos($row, $s['name'])) { $size['pid']=$s['pid']; break; } } } } echo $i." - ".$brend['pid']." - ".$size['pid']." - ".$row."<br>"; if (isset($size['pid']) AND isset($brend['pid'])) { $sql = "INSERT INTO `mod_catalog_price` (`pid`, `crdate`, `cruser`, `size`, `brend`, `price`, `currency`, `line`) VALUES ('".$_POST['pid']."', '".date("Y-m-d H:i:s")."', '', '".$size['pid']."', '".$brend['pid']."', '".$data->sheets[0]['cells'][$i][$_POST['price']]."', '".$_POST['currency']."', '".$row."')"; $GLOBALS['db']->sql_query($sql); } else { $no_parsed[$i] = $data->sheets[0]['cells'][$i]; } } $brends и $sizes - массивы с возможными вариантами представления бренда или размера вида array('id' => array('pid','name')). $row имеет вид "1 165/70 R14C KC11 89/87Q Kumho 09 Korea зима м.автоб - 4 72 576". $s['name'] имеен вид "165/70 R14". В этом куске кода strpos($row, $s['name']) не находит вхождение подстроки, а если вынести это в отдельный файл и $row и $s['name'] задать приведенные выше значения, то все работает как надо. Верная подстрока всегда присутствует в массиве (проверено и перепроверено 300 раз). Подскажите, пожалуйста, в какую сторону копать.
Перед исполнением условия с strpos, пробовали выводить переменные? Код (Text): if(!$size['pid']) { foreach ($sizes as $s) { echo $row." ||| ".$s['name']."<br />"; if (strpos($row, $s['name'])) { $size['pid']=$s['pid']; break; } } }
Kronas Предоставьте больше информации. На каком момент скрипт прекращает работать? Может у вас даже до strpos скрипт не доходит.
Скрипт работать прекращает тогда, когда должен. Все остальное выполняется нормально, strpos тоже вроде-бы выполняется, но подстроку с размером в строке не находит, при этом бренды находятся в 99% случаев. Кодировка строки и подстрок - UTF-8
Если strpos не отрабатывает, значит либо переданные ему данные не верны, либо скрипт не вошел в тело условия if().
Возможно, разные кодировки (в строке, которую нужно найти и в строке, в которой ищем). strpos может вернуть 0 в качестве результата поиска (совпадение найдено в нулевой позиции), в этом случае если не сравнивать на тип, можно получить, что подстрока какбы не найдена. Т.е. $searched = strpos($str, $search); // $searched может быть равен 0 if($searched) echo('Найдено'); // это "Найдено" не отобразиться if($searched !== false) echo('Найдено'); // это "Найдено" отобразиться
С кодировками все в порядке. Я нашел в чем была причина. Как оказалось - в строке было по 2 пробела, а в подстроке - по одному, поэтому подстрока и не находилась. А при выводе отладки в окно браузера он сворачивал несколько пробелов в один и это было незаметно. Всю голову сломал, блин, а причина как всегда банальна и проста . Спасибо всем кто откликнулся. Тему можно закрывать.