PHP krsort для пользовательской сортировки - PullRequest
0 голосов
/ 11 сентября 2018

Я сделаю все возможное, чтобы объяснить это, и извиниться, если это уже там ...

Я пытаюсь заменить определенные строки в абзаце в определенной последовательности.

Абзац:

$Paragraph = "This bit of Water has an Apple, a pseudo Apple; some Rubber and a Big Rubber too.";

У меня есть массив строк:

$SortableArray = array(
                        "Apple"=>"Green Apple",
                        "Big Rubber"=>,"Big Gasket"
                        "Rubber"=>"Gasket",
                        "pseudo Apple"=>"Banana",
                        "Water"=>"Blue Water"
                    );

Итак, я тогда krsort, который я должен отсортировать по ключу в обратном порядке, чтобы попытаться поймать pseudo Apple:

$SortableArray = array(
                        "Water"=>"Blue Water",
                        "pseudo Apple"=>"Banana",
                        "Rubber"=>"Gasket",
                        "Big Rubber"=>,"Big Gasket"
                        "Apple"=>"Green Apple"
                    );

Но это вызывает ошибку со строкой Rubber/Big Rubber.

В этом кусочке Голубой воды есть Зеленое яблоко, Банан; какой-то сингл Прокладка и большая одиночная прокладка тоже.

Я немного застрял, когда мне нужно убедиться, что Big Rubber предшествует Rubber при восстановлении массива, чтобы получить следующий результат:

$Paragraph = "This bit of Water has an Apple, a pseudo Apple; some Rubber and a Big Rubber too.";

$SortableArray = array(
                        "Water"=>"Blue Water",
                        "pseudo Apple"=>"Banana",
                        "Big Rubber"=>"Big Gasket",
                        "Rubber"=>"Single Gasket",
                        "Apple"=>"Green Apple"                      
                    );

foreach ($SortableArray as $Find=>$Replace){
    $Paragraph = str_replace($Find, $Replace, $Paragraph);
}
echo $Paragraph;

В этом кусочке Голубой воды есть Зеленое яблоко, Банан; какой-то сингл Прокладка и большая прокладка тоже.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Это идеальное соответствие для формы с двумя параметрами: strtr, которая сначала заменяет самые длинные ключи:

$Paragraph = "This bit of Water has an Apple, a pseudo Apple; some Rubber and a Big Rubber too.";

$SortableArray = array(
                        "Apple"=>"Green Apple",
                        "Rubber"=>"Single Gasket",
                        "pseudo Apple"=>"Banana",
                        "Big Rubber"=>"Big Gasket",
                        "Water"=>"Blue Water"
                    );

echo strtr($Paragraph, $SortableArray);

Вывод:

В этом кусочке голубой воды есть зеленое яблоко, банан;немного одиночной прокладки и большой прокладки тоже.

Демонстрация на rextester

0 голосов
/ 11 сентября 2018

Используйте uksort() и сортируйте по длине ключа (от самого длинного к самому короткому):

uksort($SortableArray, function ($a, $b) {
    return strlen($b) - strlen($a);
});

Добавляя это перед вашим foreach циклом, я получаю следующий вывод:

В этом кусочке голубой воды есть зеленое яблоко, банан;немного одиночной прокладки и большой прокладки тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...