llgruff
@llgruff
Scala

*** Как объединить массивы в один (запрос в цикле)?

$keywords - массив ключевых слов, м.б. любое количество
$i = 0;
$sql_query = "";
foreach ($keywords as $keyword) {
	$sql_query[$i] = 'SELECT ID FROM ' . $wpdb->posts . ' AS pos WHERE pos.post_type="attachment" AND ' . 
		'(pos.post_title LIKE "%' . $keyword . '%" OR pos.post_excerpt LIKE "%' . $keyword . '%")';
	//находим ключевое слово в заголовке или полях
	$i++;
}
for($i = 0; $i < count($sql_query); $i++) {
	$imgt_img_id_sqls[$i] = $wpdb->get_results($sql_query[$i]);	//Запуск MySQL
}
$imgt_img_id_sqls = array_merge ($imgt_img_id_sqls[0], $imgt_img_id_sqls[1], $imgt_img_id_sqls[2]);
// не знаю как объединить для общего случая, поэтому пишу для 3: [0] [1] [2]

$imgt_img_id_sqls выгдялит так:
Array
(
    [0] =&gt; stdClass Object
        (
            [ID] =&gt; 483
        )

    [1] =&gt; stdClass Object
        (
            [ID] =&gt; 482
        )

    [2] =&gt; stdClass Object
        (
            [ID] =&gt; 485
        )
)

1 вопрос: Как объединить массивы в 1 в общем случае для любого $i?
2 вопрос: У меня запросы в цикле - допустимо ли это, если нет - научите как лучше сделать
  • Вопрос задан
  • 651 просмотр
Решения вопроса 2
@mistergonza
PHP6 evangelist
Примерно так (1 вопрос):
$result = [];
for($i = 0; $i < count($sql_query); $i++) {
  $query_result =  $wpdb->get_results($sql_query[$i]);
  $result = array_merge($result, $query_result);	//Запуск MySQL
}

P.S. Можно вообще вместо for использовать foreach, либо count($sql_query) вынести в переменную до цикла

Второй вопрос:
Лучше в цикле не выполнять запросы, для вашего случая не плохо было бы прикрутить shpinx или lucene.
Ответ написан
@r_zaycev
Запросы в цикле выполнять ни в коем случае не нужно, можно генерировать запрос как-то вот так:

$keywords = [
	'key1',
	'key2'
];

$whereStatement = "";
array_walk($keywords, function($keyword) use (&$whereStatement){
	$whereStatement .= " OR (post.post_title LIKE '%". $keyword ."%' OR post.post_excerpt LIKE '%". $keyword ."%')";
});
$whereStatement = trim($whereStatement, ' OR ');

$sql  = "
SELECT
	ID
FROM
	" . $this->posts . " AS post
WHERE
	post.post_type='attachment'
	AND (
		" . $whereStatement . "
	)
";

echo "<pre>", print_r($sql, true), "</pre>";
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽