Выбрать часть массива |  |
Условие: есть массив строк.
Нужно выбрать часть массива, которая находится между первым элементом,
содержащим в себе одну подстроку и следующим элементом, длина которого
меньше 10.
Вот вариант решения с флагами (немного изменен мной - удалено все, что не касается сути):
<?php function array_part($a,$s_from) { for($i=0; $i<sizeof($a); $i++ ) { if( strpos ( $a[$i], $s_from ) ) $StartPathSection = 1; if( strlen ( $a[$i] ) < 10 and $StartPathSection == 1 ) $StopPathSection = 1; if( $StartPathSection == 1 and $StopPathSection != 1 ) { if( $SavePart == 1 ) $a_result[] = $a[$i]; $SavePart = 1; } } return $a_result; } ?>
Кроме флагов по этому коду можно было бы сделать еще вот такие замечания:
-
Некорректное использование функции
strpos.
В нашем случае функция не будет работать правильно, если искомая подстрока
$s_from находится в самом начале строки - позиция у этой
подстроки в таком случае будет “0”, при использовании такого условия,
как в приведенном выше примере, это означает «нет, не найдено».
О такой особенности, кстати, прямо говорится в документации.
-
Использование неинициализированных переменных.
Хотя PHP и допускает это, в целом это является дурным тоном и при
злоупотреблении легко может привести к появлению ошибок
и значительно снижает безопасность интернет-приложения.
Особенно в комбинации с нестандартными настройками (например, при
включенном register_globals).
-
Нетипичное использование оператора
and. От оператора
&& этот оператор отличается тем, что у него
выше приоритет. В целом, это не является ошибкой, просто странно его
здесь видеть, когда для него нет особой необходимости.
-
Результат, который вернет эта функция в случае исходного массива нулевой
длины, вообще говоря, является неопределенным.
Вот вариант решения «от меня»:
<?php function array_part($a,$s_from) { $k=false; for($i=0;$i<count($a)&&$k===false; $i++ ) { if(strpos($a[$i], $s_from)!==false) $k=$i; } if($k===false) return array(); $a_result=array(); for($i=$k;$i<count($a)&&strlen($a[$i])>=10;$i++) $a_result[]=$a[$i]; return $a_result; } ?>
Смотрите также
Прототип для этого примера:
http://phpclub.ru/talk/showthread.php?postid=542488#post542488
Последняя модификация: 13.11.05 23:56 q Не проходите мимо! Оставьте Ваш комментарий в форуме! >>> Цитирование материалов моего сайта приветствуется! при условии видимой действующей! гиперссылки на мой сайт. [Ссылки] Если Вы нашли опечатку на этой странице, пожалуйста, выделите ее мышью и нажмите Ctrl+Enter. Сделаем язык чище! (c) Yuri Popoff, 2004 - 2008, popoff.donetsk.ua, style.donetsk.ua |
|