@liza2019

Как пересортировать массив?

есть строка, 2LbGeAo-MTJkZjA-2M1ZjA5-YTljMGZ-AzZjFkY-hYmUyZW-1NThhMD-Y=
она преобразована в массив
Array ( [0] => 2LbGeAo [1] => MTJkZjA [2] => 2M1ZjA5 [3] => YTljMGZ [4] => AzZjFkY [5] => hYmUyZW [6] => 1NThhMD [7] => Y= )
после чего выделен первый элемент массива в переменную $a = 2LbGeAo; и так же разложен на массив, получаем 2 массива
$a = Array ( [0] => 2 [1] => L [2] => b [3] => G [4] => e [5] => A [6] => o )
$b = Array ( [0] => MTJkZjA [1] => 2M1ZjA5 [2] => YTljMGZ [3] => AzZjFkY [4] => hYmUyZW [5] => 1NThhMD [6] => Y= )
пересортировка
array_multisort($a, SORT_NATURAL, $b);
получаем пересортированные массивы
Array ( [0] => 2 [1] => A [2] => G [3] => L [4] => b [5] => e [6] => o )
Array ( [0] => MTJkZjA [1] => 1NThhMD [2] => AzZjFkY [3] => 2M1ZjA5 [4] => YTljMGZ [5] => hYmUyZW [6] => Y= )
преобразуем в строки и получаем строки
2AGLbeo
MTJkZjA-1NThhMD-AzZjFkY-2M1ZjA5-YTljMGZ-hYmUyZW-Y=

а теперь вопрос.
нам известно только эти конечные строки
2AGLbeo
MTJkZjA-1NThhMD-AzZjFkY-2M1ZjA5-YTljMGZ-hYmUyZW-Y=
как их пересортировать что бы получились исходные ?
2LbGeAo
MTJkZjA-2M1ZjA5-YTljMGZ-AzZjFkY-hYmUyZW-1NThhMD-Y=
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
Я вначале не обратил внимение что:
после чего выделен первый элемент массива в переменную $a = 2LbGeAo

и таким образом 2LbGeAo уже не содержится в итоговой пересортированной длинной строке.
В этот момент теряется информация об исходном порядке и поэтому востановлена строка быть не может. Задача не решаема в такой постановке.

Но если бы этот элемент не изымался из строки, то востановление было бы возможно так как я описал ранее. Мой прежний ответ ниже:

Сначала нужно восстановить порядок символов в короткой строке. Это можно сделать отыскав ее среди подстрок длинной. Это несложно - разбейте длинную на массив подстрок: $shuffle = Array ( [0] => 2LbGeAo [1] => MTJkZjA [2] => 2M1ZjA5 [3] => YTljMGZ [4] => AzZjFkY [5] => hYmUyZW [6] => 1NThhMD [7] => Y= ), для каждого элемент сделайте разбиение на массив, сортировку и объединение назад в строку. У вас получится еще один массив Array ( [0] => 2AGLbeo [1] => AMTJZkj [2] => 125AMZj и так далее. Объедините эти два массива используя второй как ключи: Array ( [2AGLbeo] => 2LbGeAo [AMTJZkj] => AkMTJjZ ... и в ключе равном вашей короткой строке найдете ее исходный вид - 2LbGeAo

Далее дело техники - 2AGLbeo указывает текущее расположение подстрок, а 2LbGeAo то которое вам надо востановить. Разбиваете обе строки на массивы так чтобы они были ключами: $a1 = [2=>0,A=>1,G=>2,L=>3 ... и т.д.] и $a2 => [2=>0,L=>1,b=>2,G=>3 ... и так далее]

Создаете новый массив $result длиной равный количеству подстрок, и в цикле перебираете элементы $a=>1:
for ($a1 as $k1=>$i1) {
$i2 = $a2[$k1]
$result[$i2] = $shuffle[$i1]
}

Все - вы востановили строку в исходном массиве. На всякий случай у вас еще есть инфа, что короткая подстрока - это первая подстрока вашей исходной строки, следовательно это допинфа для проверки того что вы правильно восстановили строку.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы