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

  • Автор темы ERmak35575
  • Обновлено
  • 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

Тем
71

Постов
174

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

Zildtgsglr


Рег
01 Apr, 2014

Тем
72

Постов
183

Баллов
583
  • 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

Тем
69

Постов
197

Баллов
562
  • 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>';
}
Код (разметка):
 

Poigesteent


Рег
25 Jan, 2011

Тем
51

Постов
202

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

Sellingbooksls


Рег
06 Oct, 2012

Тем
71

Постов
193

Баллов
598
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно