Просто с помощью preg_replace()
:
//while($row = mysqli_fetch_assoc($result)) { <!-- no longer needed
$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
//$rows = [['name'=> 'blue house'],['name'=>'car red'], [...]]
$words = ['house','car'];
print_r(preg_replace('/^('.implode('|', $words ).')\s(.+)$/i', '\2 \1', array_column($rows,'name')));
Код песочницы (для тестирования):
$rows = [
['name'=> 'blue house'],
['name'=> 'house red'],
['name'=> 'black house'],
['name'=> 'car red'],
['name'=> 'car black with driver'],
['name'=> 'pink car'],
];
$words = ['house','car'];
print_r(preg_replace('/^('.implode('|', $words ).')\s(.+)$/i', '\2 \1', array_column($rows,'name')));
выход
Array
(
[0] => blue house
[1] => red house
[2] => black house
[3] => red car
[4] => black with driver car
[5] => pink car
)
Песочница
Для верхнего регистра первая буква просто сделать это:
print_r( array_map('ucfirst',preg_replace('/^('.implode('|', $words ).')\s(.+)$/i', '\2 \1', array_column($rows,'name'))) );
выход
Array
(
[0] => Blue house
[1] => Red house
[2] => Black house
[3] => Red car
[4] => Black with driver car
[5] => Pink car
)
Песочница
Просто используйте array_map()
с ucfirst
в качестве обратного вызова. Потому что, если вы получаете их из БД, если вас интересует регистр из источника, его легче прописать в SQL, например. SELECT LOWER(name) as name FROM ...
. Так, например, если Car red
в верхнем регистре: проще получить его из БД, все ниже, потому что это избавит вас от написания пользовательского обратного вызова для array_map()
.
Регулярное выражение:
Поиск '/^('.implode('|', $words ).')\s(.+)$/i'
или '/^(house|car)\s(.+)$/i'
^
Начало строки
(...)
Первая группа захвата
'.implode('|', $words ).'
каждое слово отделяется |
Или, например, house|car
\s
Пробел, это первое слово, поэтому за ним всегда должно следовать одно
(...)
Вторая группа захвата
.+
Совпадение с чем угодно
$
Соответствует концу строки
\i
Флаг без учета регистра
Замените '\2 \1'
, просто переверните группы захвата.
Таким образом, в основном мы сопоставляем любые элементы в массиве, которые начинаются с одного из слов в нашем списке слов, за которым следует пробел и еще несколько слов. Затем мы заменяем эти совпадения сначала оставшейся частью, а также первым словом, которое мы нашли последним (эффективно переворачивая их).
Другие вещи, которые я здесь изменил: вы можете получить весь набор результатов, а затем использовать столбец массива, чтобы получить только столбец name
. В PDO
я мог бы сделать это с PdoStatement::fetchAll(PDO::FETCH_COLUMN)
и не нуждаться в столбце массива, но я давно не использовал MySqli. Так что это был единственный способ, которым я мог думать.
И последнее: если это все, что вам нужно от БД, убедитесь, что выбрано только поле name
. Это может улучшить производительность, потому что меньше данных передается из БД в PHP и т. Д ...
Ура!