Сортировка массива PHP

У меня возникла проблема при написание скрипта, буду весьма благодарен если кто поможет.
Суть проблемы вот в чём:
У меня есть массив различных слов или словосочетаний из него мне нужно сделать другой массив таким обзором, что бы если значение ячейки массива повторялось в других ячейках этого же массива,то в новый массив записывались только отличия и так по всем ячейкам. Приведу пример.

Вот массив слов:
array(
	'игры',
	'скачать игры',
	'игры бесплатно',
	'игры девочек',
	'игры онлайн',
	'игры торрент',
	'игры мальчиков',
	'скачать игры дома'
	);


Берем первую ячейку значение "игры" смотрим где это слово есть. Присутствует во всех ячейках следовательно берем из них отличия и записываем в первую ячейку нового массива далее берем вторую "скачать игры" значение присутствует в последней ячейке массива берем отличие этого выражения "дом" и записываем во вторую и так далее.

должно получиться
array(
	'скачать бесплатно девочек онлайн торрент мальчиков',
	'дома',
	'',
	'',
	'',
	'',
	'',
	''
	);

Уже замучился, ни как не получается сделать, если у кого есть мысли по поводу этого или решение буду весьма благодарен за помощь.
  • Вопрос задан
  • 2687 просмотров
Пригласить эксперта
Ответы на вопрос 5
iproger
@iproger
Безответственный гений
Вот вариант, может подойдет.
ideone.com/FZBEJ5
Ответ написан
@RokkerRuslan
Общий алгоритм на самом деле простой. Если вам нужна реализация "минутка" то:
words = ['игры',
         'скачать игры',
         'игры бесплатно',
         'игры девочек',
         'игры онлайн',
         'игры торрент',
         'игры мальчиков',
         'скачать игры дома']

result = ['' for _ in words]

def is_match(pattern, word):
    # На самом деле, я бы не вынес поиск в отдельную функцию:
    # if words.find(pattern) != -1, но вы можете написать свою реализацию
    # если в php нет подходящего инструмента или вам понадобится
    # более сложная функциональность
    return word.find(pattern) != -1 

def diff(pattern, word):
    # Тут также можете написать свою реализацию
    # В самом простейшем случае, просто замена на пустую строку.
    # Однако возникают проблемы, в таком случае слово "скачать"
    # будет добавленно два раза, из второго элемента и последнего,
    # исходя из вашего алгоритма.

    # гарантированные пробелы, для того чтобы слова не слипались
    return ' ' + word.replace(pattern, '').strip() + ' '

for i, pattern in enumerate(words):

    for word in words:

        if is_match(pattern, word):
            result[i] += diff(pattern, word)


Но мне кажется, что операции со строками (то есть представление словосочетаний как строки) здесь не самый лучший вариант.
Ответ написан
@Michai_Firsov
Я сейчас спать, а утром попробую выслать решение...
Ответ написан
Комментировать
@Michai_Firsov
Вот он красавец, я сделал по твоей логике, но там все равно встречаются одинаковые слова, там где "скачать игры дома" поиск по слову "игры" и слово "скачать" было ранее, если надо исправлю.

<?php

$array = array(
	'игры',
	'скачать игры',
	'игры бесплатно',
	'игры девочек',
	'игры онлайн',
	'игры торрент',
	'игры мальчиков',
	'скачать игры дома'
	);

$val_0 = $array;
for($i = 0; isset($val_0[$i]); $i++){
	$val_1 = $val_0[$i];
	foreach($val_0 as &$val_2){
		if(strpos($val_2, $val_1) !== false && $val_1 != $val_2){
			$val_3 = str_replace($val_1, '', $val_2);
			$val_4 = explode(' ', $val_3);
			foreach($val_4 as &$val_5){
				if($val_5 != '' && $val_6[$i] != ''){
					$val_6[$i] .= ' '.$val_5;
				}else if($val_5 != ''){
					$val_6[$i] .= $val_5;
				}
			}
		}
	}
}
$result = array_values($val_6);

print_r($result);

//вывод массива для наглядности, что пробелы стоят верно
for($i = 0; isset($result[$i]); $i++){
	echo '<br /><br />';
	echo 'Часть массива '.$i.':<br />';
	echo '|'.$result[$i].'|<br />';
}

?>
Ответ написан
Комментировать
@Michai_Firsov
довел до ума, теперь должен работать как часы )
<?php

$array = array(
'септик',
'септик танк',
'септик дома',
'септик цена',
'загородного септик',
'септики загородного дома',
'септик топас',
'септик руками',
'септик отзывы',
'септик купить',
'куплю септик',
'откачка септиков',
'установка септика',
'септик дачи',
	);

$val_0 = $array;
for($i = 0; isset($val_0[$i]); $i++){
	$val_1 = $val_0[$i];
	foreach($val_0 as &$val_2){
		$val_1_1 = explode(' ', $val_1);
		$val_1_3 = '';
		for($n = 0; isset($val_1_1[$n]); $n++){
			$val_1_2 = $val_1_1[$n];
			if(strpos($val_2, $val_1_2) !== false){
				$val_1_3[$n] = 1;
			}else{
				$val_1_3[$n] = 0;
			}
		}
		if(array_search('0', $val_1_3) === false && $val_1 != $val_2){
			$val_3 = $val_2;
			foreach ($val_1_1 as &$val_1_4){
				$val_3 = str_replace($val_1_4, '', $val_3);
			}
			$val_4 = explode(' ', $val_3);
			for($b = 0; isset($val_4[$b]); $b++){
				if(strlen(utf8_decode($val_4[$b])) < 3){
					unset($val_4[$b]);
				}
			}
			foreach($val_4 as &$val_5){
				if(strpos($val_6[$i], $val_5) === false){
					if($val_5 != '' && $val_6[$i] != ''){
						$val_6[$i] .= ' '.$val_5;
					}else if($val_5 != ''){
						$val_6[$i] .= $val_5;
					}
				}
			}
		}else{
			$val_6[$i] .= '';
		}
	}
}
$result = $val_6;
print_r($result);

//вывод массива для наглядности, что пробелы стоят верно
for($i = 0; array_key_exists($i, $result); $i++){
	echo '<br /><br />';
	echo 'Часть массива '.$i.':<br />';
	echo '|'.$result[$i].'|<br />';
}

?>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы