Приципился тут навязчивый заказчик, надоел сил нет)) Вот что просит Проект который я делаю ему сайт каталог (ну скажем массажисток) Онпросит выводить в списке/галерее анкет их не только по Тарифу, ну это понятно это легко от VIPтарифа к среднему и от среднего к минимальному, ну это понятно GROUP BY `plane` DESC Это авыводится. Так он что еще просит, он хочет чтобы внутри вот этих тарифов была случайная сортировка. То есть я делал и GROUP BY `plane` DESC RAND() и наоборот в начале вставлял и применял HAVING ничего не помогает Я не знаю как сортировать не только по Тарифу но и при этом еще и в случайном порядке внутри этого тарфиа. И он говорит что на сайте конкуренте это так реализовано. Офигеть --- Уважаемые опытные програмимсты PHP, помогите пожалуйста чем можете ?))
чет анекдот вспомнил)) сделайте вывод по тарифам как Вы уже сделали... а микс анкет внутри тарифных блоков сделайте средствами пхп..
1. Я так понимаю анкет много 2. У Вас там пагинация 3. Вам надо получить к примеру 25 анкет в порядке уменьшения стоимости тарифного плана размещения 4. Сделали запрос к базе, получили 25 анкет.. 5. Дальше прогнали массив в цикле что бы получить несколько массивов с анкетами каждого тарифа (или один если анкет одного тарифа на странице 25) 6. Дальше сделали shuffle() для каждого массива 7. Дальше сделали array_merge() для всех массивов последовательно.. что бы они склеились друг за другом.. PHP: $y = [ 0 => [ 0 => ['a' => 'a'], 1 => ['b' => 'b'], 2 => ['c' => 'c'], 3 => ['d' => 'd'], ], 1 => [ 0 => ['e' => 'e'], 1 => ['r' => 'r'], 2 => ['t' => 't'], 3 => ['y' => 'u'], ] ]; $new = []; foreach($y as $tmp){ shuffle($tmp); $new = array_merge($new, $tmp); } var_dump($new); die();
И все это прям в цикле выборки из Бд foreach [ ... } ??? --- Добавлено --- Вот смотрите у меня такой код идет: $res = DBController::arrayData( "*", "ankets", " `status` = 1 ORDER BY `plane` DESC LIMIT $page " ); foreach( $res as $row ) { echo ' <div class="card card-body"> <h4> ' . $row['name'] . ' </h4> Ну и так далее... </div> '; } ----- И я так понял что сделать перед foreach вот так да $res = shuffle( $res ); И далее уже foreach( $res as $row ) { .... } Я правильно понимаю??
не понял вопрос)) но еще раз: 1. Получили из базы то что Вам нужно в виде массива 2. Пересортировали массив что бы получилось что то типа PHP: $result = [ 0 => ['Анекты тарифа ВИП'], 1 => ['Анекты тарифа не ВИП'], 2 => ['Анекты тарифа еще хуже'], ]; 4. Дальше массив $result опять в foreach и тут уже происходит все то что в коде в предыдущем моем сообщении происходит.. возьмите мой код из предыдущего соощения и запустите его несколько раз.. увидите результат.. --- Добавлено --- Между этой строкой и этой вам надо подготовить массив $res что бы все перемешалось..
Вот смотрите Алексей, я могу просто прмиенить функцию shuffle() к массиву из Бд ну к $res ?? --- Добавлено --- вот так просто можно? shuffle($res); и далее просто обычный foreach() { ... }
нет)) не можете) тогда у Вас перемешаются ВСЕ элементы из массива.. а Вам сначала надо разбить на группы которые нужно отдельно перемешивать - отдельно их каждую перемешать - а потом перемешанное склеить..
Вот что выдал когда я прост оприменил эту функцию shuffle Warning: shuffle() expects parameter 1 to be array, object given in /home/virtwww/w_wap-pambala_0e42069c/http/core/AnketsController.php on line 388 --- Добавлено --- Я не понимаю вот здесь shuffle($tmp); $new = array_merge($new, $tmp); потом мне опять foreach( $new as $item ) { ... } Да???
shuffle должен получать массив, а вы ему дали объект.. смотрите что даете ему) --- Добавлено --- да.. $new это уже перемешанный по группам массив в котором перемешанные элементы каждой из групп последовательно склеены..
--- Выдает ошибку я вот атк сделал: $resData = DBController::arrayData( "*", $table, " `status` = 1 AND `active_days` > 0 $PriceSearch $AgeSearch $SearchByCats $SearchByLoc ORDER BY `plane` DESC LIMIT $page " ); $new = []; foreach( $resData as $key ) { shuffle($tmp); $new = array_merge($new, $key); } foreach( $new as $key ) { Здесь вывод анкет }
к примеру plane = 1 это самый крутой план plane = 3 это самый плохой.. вставьте этот код куда то и нажмите несколько раз f5 PHP: $resData = [ 0 => [ 'name' => 'one', 'plane' => 1, ], 1 => [ 'name' => 'two', 'plane' => 1, ], 2 => [ 'name' => 'three', 'plane' => 1, ], 3 => [ 'name' => 'four', 'plane' => 2, ], 4 => [ 'name' => 'five', 'plane' => 2, ], 5 => [ 'name' => 'six', 'plane' => 2, ], 6 => [ 'name' => 'seven', 'plane' => 3, ], 7 => [ 'name' => 'eight', 'plane' => 3, ], 8 => [ 'name' => 'nine', 'plane' => 3, ], 9 => [ 'name' => 'ten', 'plane' => 3, ], ]; $groups = []; foreach ($resData as $item) { $groups[$item['plane']][] = $item; } $result = []; foreach ($groups as $group) { shuffle($group); $result = array_merge($result, $group); } var_dump($result); die();
Вот такой ответ: Warning: Illegal string offset 'photoStatus' in /home/virtwww/w_wap-pambala_0e42069c/http/core/AnketsController.php on line 399 Warning: Illegal string offset 'id' in /home/virtwww/w_wap-pambala_0e42069c/http/core/AnketsController.php on line 402
я не знаю что у вас там на строке 399 и 402)) не знаю структуру того что вам метод arrayData возвращает)) принцип перемешивания - вверху)) код рабочий - просто измените его под ваши объекты или массивы)) или что там)
$resData это из Базы Данных массив, А если без array_merge а прост оперемишаь shuffle и сделаь foreach ?
Ну что же мне делать то?? господи помоги этот заказчик придурошный не заплатит если я так не сделаю Понимаете идет выборка из базы данных ну обычная SELECT * FROM ORDER BY `plane` DESC Почему не работает ваш код тогда??
мой код это пример сортировки.. я не знаю какие у вас там названия ключей в массиве... может там вообще не массив а объекты приходят..
СВЕРШИЛОСЬ ЧУДО!!!!! Получилось!!! я сделал как вы написали прост овот атк даженичего не трогал!!! И анкеты стали случайн овнутритафриа размешиваться!!! СПАСИБО ВАМ !!! Я как получу гонорар скину вам на поддерку вашего форума! Где можно посомтерть куда денюжку сбросить вам? --- Добавлено --- Я прост осделал вот так: $resData = DBController::arrayData( "*", $table, " `status` = 1 AND `active_days` > 0 $PriceSearch $AgeSearch $SearchByCats $SearchByLoc ORDER BY `plane` DESC LIMIT $page " ); $groups = []; foreach ($resData as $item) { $groups[$item['plane']][] = $item; } $result = []; foreach ($groups as $group) { shuffle($group); $result = array_merge($result, $group); } foreach( $result as $key ) { ВЫВОД АНКЕТ }