Циклы массивов

  • Автор темы ERmak35575
  • 41
  • Обновлено
  • 17, May 2024
  • #1
Привет, Я ищу лучший способ перебрать массив для совпадений и несоответствий. По сути, я хочу вывести HTML-тег тега, когда есть совпадение тега, и другой HTML-код, если совпадения нет. Код должен поддерживать оба массива с разным объемом данных.

Спасибо за прочтение.
 $stmGenres = $db->prepare('SELECT `tag` FROM `tags` WHERE `username` = ? AND `category` = ?');

$stmGenres->execute(array($poster->return_username(), 'genres'));

$posterGenres = $stmGenres->fetchAll();

$stmUserGenres = $db->prepare('SELECT `tag` FROM `tags` WHERE `username` = ? AND `category` = ?');

$stmUserGenres->execute(array($poster->return_username(), 'genres'));

$userGenres = $stmUserGenres->fetchAll();

if(count($posterGenres) >= 1)

{

echo '<div id="browse-search-tray" class="buffer-top">

<h4 class="sm-buffer-bottom">Genres</h4>';

foreach($posterGenres as $key => $val)

{

foreach($userGenres as $key2 => $val2)

{

if($posterGenres[$key]['tag'] == $userGenres[$key2]['tag'])

{

// match

echo '<span class="label label-default tagselected" style="margin-bottom:4px;">'.$posterGenres[$key]['tag'].'</span>';

}else{

// no match

echo '<span class="label label-default tag" style="margin-bottom:4px;">'.$posterGenres[$key]['tag'].'</span>';

}

}

}

echo '</div>';

}
Код (разметка):

ERmak35575


Рег
07 Mar, 2012

Тем
1

Постов
2

Баллов
12
  • 06, Jun 2024
  • #2
array_key_exists не будет работать из-за многомерных массивов. Я исправил код выше. В выборе это просто $poster->return_username() и $user->return_username(). Он выводит во многие теги из-за двойных циклов foreach.
 

Wusa


Рег
01 Apr, 2014

Тем
1

Постов
3

Баллов
13
  • 08, Jun 2024
  • #3
класс диапазона = метка

если это метка, то почему это не метка? Дайте угадаю, брехня или что-то в этом роде?

Вы выбираете только TAG, так почему вы тратите время на возврат индекса и доступ к массиву по индексу?!?

Нет причин тратить время на подсчет, ПРЕДПОЛАГАЯ, что это два разных запроса (сейчас это не так, как указал @ThePHPMaster), остальная часть может быть просто:

 
[

'red' => 'cat',

'blue' => 'catselected',

'green' => cat',

'yellow' => 'catselected',

'orange' => 'cat',

'purple' => 'cat'
]


Код (разметка): Хотя это немного расточительно в отношении памяти, это намного проще - я предполагаю, что ваша логика заключается в том, что вам нужны ВСЕ теги, если категория соответствует ИЛИ пользователь соответствует, а не ОБА, но если они существуют в обоих, дайте ему другой класс?

Вы получаете список тех, которые соответствуют желаемому жанру, список тегов для пользователя, вы объединяете их в ассоциативный массив с ключом по тегу, затем объединяете и пересекаете их с классом с более высоким приоритетом.

При использовании array_merge последний параметр массива перезапишет существующий индекс в ассоциативном результате.

Допустим, для пользователя у вас было:

красный, синий, зеленый, желтый

... и по жанру у вас было:

синий, желтый, оранжевый, фиолетовый

Результатом слияния и пересечения этого массива должен быть:

  // again, why the hell are these two the same query?!? // taking a WILD guess as to what it should be $stmt = $db->prepare(' SELECT tag FROM tags WHERE username = ? '); $stmt->execute([$poster->return_username()]); $userKeys = $stmt->fetchAll(); $stmt = $db->prepare(' SELECT tag FROM tags WHERE category = ? '); $stmt->execute(['genres']); $genreKeys = $stmt->fetchAll(); $result = array_merge( array_fill_keys($userKeys, 'tag'), array_fill_keys($genreKeys, 'tag'), array_fill_keys( array_intersect($userKeys, $genreKeys), 'tagCategory' ) ); if (count($result)) { echo ' <div id="browse-search-tray"> <h2>Genres</h2>'; foreach ($result as $tagName => $className) echo ' <span class="', $className, '">', $tagName, '</span>'; echo ' </div>'; } 
Код (разметка): В противном случае то, что вы делаете, не имеет никакого смысла.

или вам нужны только те пользователи, которые, если существует тег жанра, выбирают их... ДЕЙСТВИТЕЛЬНО неясно, какие у вас данные и что вы пытаетесь что с этим делать.
 

elena.smirnova2404


Рег
30 Sep, 2015

Тем
1

Постов
3

Баллов
13
  • 09, Jun 2024
  • #4
Поскольку вы учитесь по ходу дела, я бы разбил это на этапы.
  • получить ваши данные
  • обрабатывать ваши данные
  • выведите свои данные


так что, без тестирования, я бы, наверное, начал с этого
 <?php

$stmGenres = $db->prepare('SELECT `tag` FROM `tags` WHERE `username` = ? AND `category` = ?');

$stmGenres->execute(array($poster->return_username(), 'genres'));

$posterGenres = $stmGenres->fetchAll();

$stmUserGenres = $db->prepare('SELECT `tag` FROM `tags` WHERE `username` = ? AND `category` = ?');

$stmUserGenres->execute(array($user->return_username(), 'genres'));

$userGenres = $stmUserGenres->fetchAll();

$matches = array();

if (count($posterGenres) > 0) {

foreach ($posterGenres as $key => $val) {

$tag = $posterGenres[$key]['tag'];

foreach ($userGenres as $key2 => $val2) {

if ($tag == $userGenres[$key2]['tag']) {

// even if it's in the array there's no harm in overwriting the value

$matches[$tag] = 'tagselected';

} else {

// just in case a tag can turn up twice, take the check out if that's not possible

if (!array_key_exists($tag, $matches)) {

$matches[$tag] = 'tag';

}

}

}

}

}

// now that we have our tags all sorted out we can output them to the browser

if (count($matches) > 0) {

echo '<div id="browse-search-tray" class="buffer-top">

<h4 class="sm-buffer-bottom">Genres</h4>';

foreach ($matches as $tag => $class) {

echo "<span class='label label-default {$class}' style='margin-bottom:4px;'>{$tag}</span>";

}

echo '</div>';

}
Код (разметка):
 

bibi1


Рег
25 Jan, 2011

Тем
0

Постов
3

Баллов
3
  • 11, Jun 2024
  • #5
Если я не ошибаюсь, $posterGenres — это то же самое, что $userGenres. Оба запроса одинаковы и возвращают один и тот же массив. Кроме того, вы можете ускорить процесс, имея массив пользовательских жанров: userGenres = array(1 => true, 2 => true и т. д.); и выполнение проверки и проверки при циклическом прохождении через posterGenres. Это избавит вас от циклов.
 

Александр Долотов


Рег
06 Oct, 2012

Тем
1

Постов
2

Баллов
12
Тем
49554
Комментарии
57426
Опыт
552966

Интересно