За последние 24 часа нас посетили 16962 программиста и 1632 робота. Сейчас ищут 667 программистов ...

Задание от заказчика, не могу понять как сделать

Тема в разделе "PHP для новичков", создана пользователем Storm57, 4 фев 2020.

Метки:
  1. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Приципился тут навязчивый заказчик, надоел сил нет))

    Вот что просит
    Проект который я делаю ему сайт каталог (ну скажем массажисток)

    Онпросит выводить в списке/галерее анкет их не только по Тарифу, ну это понятно это легко от VIPтарифа к среднему и от среднего к минимальному, ну это понятно GROUP BY `plane` DESC
    Это авыводится. Так он что еще просит, он хочет чтобы внутри вот этих тарифов была случайная сортировка.
    То есть я делал и GROUP BY `plane` DESC RAND() и наоборот в начале вставлял и применял HAVING ничего не помогает
    Я не знаю как сортировать не только по Тарифу но и при этом еще и в случайном порядке внутри этого тарфиа.
    И он говорит что на сайте конкуренте это так реализовано. Офигеть
    ---
    Уважаемые опытные програмимсты PHP, помогите пожалуйста чем можете ?))
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    чет анекдот вспомнил))
    сделайте вывод по тарифам как Вы уже сделали...
    а микс анкет внутри тарифных блоков сделайте средствами пхп..
     
  3. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Да уж легко вы сказали, но я с таким никогда не сталкивался как так сделать ??
     
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    1. Я так понимаю анкет много
    2. У Вас там пагинация
    3. Вам надо получить к примеру 25 анкет в порядке уменьшения стоимости тарифного плана размещения
    4. Сделали запрос к базе, получили 25 анкет..
    5. Дальше прогнали массив в цикле что бы получить несколько массивов с анкетами каждого тарифа (или один если анкет одного тарифа на странице 25)
    6. Дальше сделали shuffle() для каждого массива
    7. Дальше сделали array_merge() для всех массивов последовательно.. что бы они склеились друг за другом..

    PHP:
    1. $y = [
    2.     0 => [
    3.         0 => ['a' => 'a'],
    4.         1 => ['b' => 'b'],
    5.         2 => ['c' => 'c'],
    6.         3 => ['d' => 'd'],
    7.     ],
    8.  
    9.     1 => [
    10.         0 => ['e' => 'e'],
    11.         1 => ['r' => 'r'],
    12.         2 => ['t' => 't'],
    13.         3 => ['y' => 'u'],
    14.     ]
    15. ];
    16. $new = [];
    17. foreach($y as $tmp){
    18.     shuffle($tmp);
    19.     $new = array_merge($new, $tmp);
    20. }
    21. var_dump($new);
    22. die();
     
  5. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    И все это прям в цикле выборки из Бд 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 ) { .... }


    Я правильно понимаю??
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    не понял вопрос)) но еще раз:
    1. Получили из базы то что Вам нужно в виде массива
    2. Пересортировали массив что бы получилось что то типа
    PHP:
    1. $result = [
    2.     0 => ['Анекты тарифа  ВИП'],
    3.     1 => ['Анекты тарифа  не ВИП'],
    4.     2 => ['Анекты тарифа  еще хуже'],
    5. ];
    4. Дальше массив $result опять в foreach и тут уже происходит все то что в коде в предыдущем моем сообщении происходит..
    возьмите мой код из предыдущего соощения и запустите его несколько раз.. увидите результат..
    --- Добавлено ---
    Между этой строкой
    и этой
    вам надо подготовить массив $res что бы все перемешалось..
     
  7. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Вот смотрите Алексей, я могу просто прмиенить функцию shuffle() к массиву из Бд ну к $res ??
    --- Добавлено ---
    вот так просто можно? shuffle($res);
    и далее просто обычный foreach() { ... }
     
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    нет)) не можете) тогда у Вас перемешаются ВСЕ элементы из массива.. а Вам сначала надо разбить на группы которые нужно отдельно перемешивать - отдельно их каждую перемешать - а потом перемешанное склеить..
     
  9. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Вот что выдал когда я прост оприменил эту функцию 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
    --- Добавлено ---

    Я не понимаю вот
    здесь
    1. shuffle($tmp);
    2. $new = array_merge($new, $tmp);
    потом мне опять foreach( $new as $item ) { ... }
    Да???
     
  10. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    shuffle должен получать массив, а вы ему дали объект.. смотрите что даете ему)
    --- Добавлено ---
    да.. $new это уже перемешанный по группам массив в котором перемешанные элементы каждой из групп последовательно склеены..
     
  11. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    ---

    Выдает ошибку я вот атк сделал:


    $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 ) {
    Здесь вывод анкет
    }
     
  12. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    к примеру plane = 1 это самый крутой план
    plane = 3 это самый плохой..
    вставьте этот код куда то и нажмите несколько раз f5
    PHP:
    1. $resData = [
    2.     0 => [
    3.         'name' => 'one',
    4.         'plane' => 1,
    5.     ],
    6.     1 => [
    7.         'name' => 'two',
    8.         'plane' => 1,
    9.     ],
    10.     2 => [
    11.         'name' => 'three',
    12.         'plane' => 1,
    13.     ],
    14.     3 => [
    15.         'name' => 'four',
    16.         'plane' => 2,
    17.     ],
    18.     4 => [
    19.         'name' => 'five',
    20.         'plane' => 2,
    21.     ],
    22.     5 => [
    23.         'name' => 'six',
    24.         'plane' => 2,
    25.     ],
    26.     6 => [
    27.         'name' => 'seven',
    28.         'plane' => 3,
    29.     ],
    30.     7 => [
    31.         'name' => 'eight',
    32.         'plane' => 3,
    33.     ],
    34.     8 => [
    35.         'name' => 'nine',
    36.         'plane' => 3,
    37.     ],
    38.     9 => [
    39.         'name' => 'ten',
    40.         'plane' => 3,
    41.     ],
    42. ];
    43.  
    44. $groups = [];
    45. foreach ($resData as $item) {
    46.     $groups[$item['plane']][] = $item;
    47. }
    48. $result = [];
    49. foreach ($groups as $group) {
    50.     shuffle($group);
    51.     $result = array_merge($result, $group);
    52. }
    53.  
    54.  
    55. var_dump($result);
    56. die();
     
  13. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Вот такой ответ:

    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
     
  14. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я не знаю что у вас там на строке 399 и 402)) не знаю структуру того что вам метод arrayData возвращает))
    принцип перемешивания - вверху)) код рабочий - просто измените его под ваши объекты или массивы)) или что там)
     
  15. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    $resData это из Базы Данных массив,
    А если без array_merge а прост оперемишаь shuffle и сделаь foreach ?
     
  16. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    будет не такой как Вам нужен результат))
     
  17. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Ну что же мне делать то?? господи помоги этот заказчик придурошный не заплатит если я так не сделаю

    Понимаете идет выборка из базы данных ну обычная

    SELECT * FROM ORDER BY `plane` DESC

    Почему не работает ваш код тогда??
     
  18. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    мой код это пример сортировки.. я не знаю какие у вас там названия ключей в массиве... может там вообще не массив а объекты приходят..
     
  19. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    Да нет ну вот это * то ест ьвсе поля из Базы данных понимаете

    Как мне их ничего не мониаю
     
  20. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    сделайте var_dump того что из базы приходит)
     
  21. Storm57

    Storm57 Новичок

    С нами с:
    19 фев 2019
    Сообщения:
    20
    Симпатии:
    2
    СВЕРШИЛОСЬ ЧУДО!!!!!
    Получилось!!!

    я сделал как вы написали прост овот атк даженичего не трогал!!!

    И анкеты стали случайн овнутритафриа размешиваться!!!


    СПАСИБО ВАМ !!!

    Я как получу гонорар скину вам на поддерку вашего форума!
    Где можно посомтерть куда денюжку сбросить вам?
    --- Добавлено ---
    Я прост осделал вот так:

    $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 ) {
    ВЫВОД АНКЕТ
    }
     
    AlexProg нравится это.
  22. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    мне кажется это лишнее))
     
    AlexProg нравится это.