поиск в массивах (непонятно работает)

d2048

Новичок
здравствуйте
такой код
PHP:
<?php
     $strings = array(
		"1123",
		"222 word2",
		"123 word5 456",
		"word2 : 5678",
		"word7: 222",
		"word8: 8890"
		);
$words = array(
		"word1",
		"word2",
		"222",
		"123",
		);

	echo "<pre>";
	print_r($strings);
	print_r($words);
	echo "</pre>";
	
	foreach($strings as $string){
		foreach($words as $word){
			if(strpos($string, $word)){
				echo $word." ===> ".$string."<br />";
			}
		}
	}
?>
дает такой выход
PHP:
Array
(
    [0] => 1123
    [1] => 222 word2
    [2] => 123 word5 456
    [3] => word2 : 5678
    [4] => word7: 222
    [5] => word8: 8890
)
Array
(
    [0] => word1
    [1] => word2
    [2] => 222
    [3] => 123
)

123 ===> 1123
word2 ===> 222 word2
222 ===> word7: 222
не совсем понятно, почему например (word2 ===> 222 word2) есть , а (222 ===> 222 word2)
и (word2 ===> word2: 5678) например нету.
задача - найти все похожие подстроки в массивах
спасибо
 

Фанат

oncle terrible
Команда форума
сначала идём в документацию по strpos и читаем большое предупреждение
 

d2048

Новичок
спасибо
PHP:
foreach($strings as $string){
		foreach($words as $word){
			$pos = strpos($string, $word);
						
			if($pos === FALSE){
				echo "no-<br />" ;
			} else {
				echo $word." ===> ".$string."<br />";
			}
		}
	}
так работает, но как то стремно выглядит этот код

а как правильно решаются такие задачи?
 

Фанат

oncle terrible
Команда форума
Это не задача, а высосанный из пальца пример.
Если будет конкретная задача, то для неё, возможно, найдётся и типовое решение
 

d2048

Новичок
задача:
на основе данных из большого файла1 сделать файл2, в котором
будут отфильтрованные данные из файла1.

мое решение:
PHP:
----------------------файл1---------------------------------------
(нужные данные в основном после ":" но есть и 
которые начинаются с начала строки  )

Идентификатор в системе:	ABCDEF12345                              
Внутренний идентификатор: 	ASDF1234                              
Ваш email адрес:                [email protected]               
 
ASD:                            1234567879                             
Адрес:                          г.Лондон ул. 1-я Пролетарская, дом 6,
                                    каб.№1                                
Телефон:                        234-52-73                              
Пупкин В.И. :               директор 

+ много всего
-------------------------------------------------------------

из него я делаю массив
PHP:
Array ($lines)
(
    [0] => Идентификатор в системе:	ABCDEF12345                              
    [1] => Внутренний идентификатор: 	ASDF1234                              
    [2] => Ваш email адрес:                [email protected]               
    [3] =>  
    [4] => ASD:                            1234567879                             
    [5] => Адрес:                          г.Лондон ул. 1-я Пролетарская, дом 6,
    [6] =>                                 каб.№1                                
    [7] => Телефон:                        234-52-73
)
еще делаю массив типа словаря
PHP:
$words = array(
		"Идентификатор в системе",
		"Ваш email адрес",
		"ASD",
		"Адрес",
                "телефон",
		"директор"
		);
из которого кодом
PHP:
$i = 0;
foreach($words as $word){
	foreach($arr as $line){
		$pos = strpos($line, $word);
		if($pos === FALSE){
			//echo $i.$line."<br />";
			} else {
			//echo "<b>".$line."</b><br>";
			$out[$i] = $line;
			$i++;	
		}
	}
}
делаю массив
PHP:
Array ($out)
(
    [0] => Идентификатор в системе:	ABCDEF12345                              
    [1] => Ваш email адрес:                [email protected]               
    [2] => Адрес:                          г.Лондон ул. 1-я Пролетарская, дом 6,
и т.д.
)
для последующего вырезания всех этих "ABCDEF12345", [email protected]
и формирования выходного файла.

есть 2 вопроса:
1)я нахожу [5] => Адрес: г.Лондон ул. 1-я Пролетарская, дом 6,
по слову из словаря "Адрес", но адрес продолжается на следующей строке
и в массив попадает как [6] => каб.№1.
как не потерять следующий элемент?
2) есть ли типовое решение, без велосипедов?
 

Вурдалак

Продвинутый новичок
Это нормальное решение за исключением, что обычный strpos() тут не подходит, посмотри mb_stripos().

1)я нахожу [5] => Адрес: г.Лондон ул. 1-я Пролетарская, дом 6,
по слову из словаря "Адрес", но адрес продолжается на следующей строке
и в массив попадает как [6] => каб.№1.
как не потерять следующий элемент?
А это уже проблема формата, откуда эти данные вообще берутся? Если предполается, что данные должны обрабатываться программой, то существуют различные CSV, XML, etc.
 

d2048

Новичок
данные берутся из большого сборного файла ,
PHP:
ASD:                            1234567879                             
Адрес:                          г.Лондон ул. 1-я Пролетарская, дом 6,
                                    каб.№1                                
Телефон:                        234-52-73                              
Пупкин В.И. :               директор
к обработке не предназначенного.
и в нем есть несколько мест, где строки незакономерно могут быть слишком длинные и в один элемент массива не лезущие.
все, за что можно зацепиться - за всегда одинаковое начало таких строк, а вот окончание их может быть и на следующей строке и через 2-3 строки и могут находиться в конце файла, так что по новому заголовку с двоеточием не выцепить.
заранее спасибо за советы.
 

WMix

герр M:)ller
Партнер клуба
а почему не хочешь explode и trim? а дальше switsh case ?

PHP:
list($key, $val) = explode(":", $arr);
switsh(trim($key)){
...
}
ну или как по твоему
PHP:
list($key, $val) = explode(":", $arr);
if( in_array($search, array(trim($key),trim($val))){

}
 

d2048

Новичок
да, list штука хорошая, но не соображу - как в листе определить заранее неопределенное количество переменных по неизвестным заранее элементам массива.
мало опыта :(
 

WMix

герр M:)ller
Партнер клуба
да, list штука хорошая, но не соображу - как в листе определить заранее неопределенное количество переменных по неизвестным заранее элементам массива.
мало опыта :(
а это уже делает while
 
Сверху