За последние 24 часа нас посетили 34147 программистов и 1314 роботов. Сейчас ищут 927 программистов ...

Комбинирование массива

Тема в разделе "PHP для новичков", создана пользователем Danil005, 14 сен 2017.

  1. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Как сделать уникальное комбинирование массива?
    Array(1,2,3,4);

    Чтобы получилось так:
    1-2
    1-3
    1-4
    2-3
    2-4
    3-4
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. $r = Array(1,2,3,4);
    6.  
    7.  
    8.  
    9. foreach ( $r as $t )
    10. {
    11.     foreach ( $r as $y )
    12.     {
    13.         if ( $t < $y )
    14.         {
    15.             printf ( '<p>%d-%d</p>', $t, $y );
    16.         }
    17.     }
    18. }
     
    [vs] нравится это.
  3. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Комбинаторика сложная наука. Не уверен, что сработает всегда и везде, но Более универсален, чем варик выше:
    PHP:
    1. $r=Array(1,2,3,4);
    2. foreach($r as $keya => $a){
    3.     foreach($r as $keyb => $b){
    4.          if($keya === $keyb){
    5.                  break;
    6.          } else {
    7.              $uniq[] = [$a, $b];
    8.          }
    9.     }
    10. }
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    у тебя универсальный нотис в коде, поэтому я приписал error чтобы видеть свою неувереность
     
  5. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    нифига подобного, php7.0 нотисов нема :D

    Да и за что, если только необъявленный uniq, если массив на обработку будет передан пустой или с одним значением. Не страшно )) Все эти проверки дело разработчика, а я просто алгоритм дал.

    Твой будет работать только с цифрами и то лишь в отсортированном массиве. Не ревнуй :D
    --- Добавлено ---
    Хотя вроде да, всегда должен быть нотис. Хз почему нету. Наверное на хосте настройки.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Написал
    PHP:
    1. <?php
    2. $r = Array(1,2,3,4);
    3.  
    4. $offset = 0;
    5. begin:
    6.     $n = 0;
    7.     reset($r);
    8.     for ($i = $offset; $i > 0; $i--) {
    9.         next($r);
    10.     }
    11.     $out = current($r);
    12.     while (next($r)) {
    13.         if (!$n) {
    14.             echo $out, '-', current($r), '<br>';
    15.         } else {
    16.             $out = $r[$offset];
    17.             prev($r);
    18.         }
    19.         $n = $n%2 == 0;
    20.     }
    21.     $offset++;
    22.     if ($offset < sizeof($r)) {
    23.         goto begin;
    24.     }
    и сократил

    PHP:
    1. <?php
    2. $r = Array(1,2,3,4);
    3.  
    4. for ($offset = 0; $offset < sizeof($r); $offset++, reset($r)) {  
    5.     for ($i = $offset; $i > 0; $i--, next($r));
    6.     for ($out = current($r); next($r); print $out . '-' . current($r) . '<br>');
    7. }
     
  7. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    А если через sql?
    У меня стоит задача:
    Есть 6 полей, если поле не пустое, то выполнем действия. Есть массив этих полей: [Москва,Краснодар,Новороссийск]
    Мы вносим в дб таким образом:
    Москва-Краснодар
    Москва-Новороссийск
    Новороссийск-Краснодар

    Но если мы добавляем еще одну запись (массив: [Сочи]) после первого добавления, должно стать так:
    Москва-Краснодар
    Москва-Новороссийск
    Москва-Сочи
    Краснодар-Сочи
    Краснодар-Новороссийск
    Новороссийск-Сочи
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    если в цифрах была какая то логика, то в городах вовсе не вижу. Да сортировка от запроса ведется DESC ASC
    была поставлена задача вывести так по такой то инфе. А что может еще придти по другому, меня это не должно канать:)
     
  9. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Я пробовал получить данные дб таблицы в массив, после объединить с массивом полей, и удалить все записи в таблице, а потом внести, все повторно. Этот вариант не подходит по двум причинам:
    1. Еали буде много записей, просто првысит лимит памяти.
    2. Если будет заполнено 1 поле из 6, то он заменит последнию запись
     
  10. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Если у тебя проблемы а ля хочу обработать массив, который превышает лимит памяти, значит у тебя неправильно спроектированное приложение/бд. 99,99999999999%
     
    Fell-x27 нравится это.
  11. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Этот лимит происходи из-за бесконечного цикла, тут все решено, а вот вторая проблема - нет.
     
  12. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    C какой целью тебе надо обрабатывать единовремененно все эти данные и создавать эти странные пути Москва - Вологда и т.д.?

    Лучше бы ты задачу описал, а не решение своих странные идей просил :D
     
  13. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
     
  14. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    381
    Симпатии:
    74
    Ты не задачу описываешь, а свое решение. Короче я понял, дело твое, каждый дрочит как он хочет..
     
  15. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Я написал задачу и как должно получиться в конце концов.
    Есть 6 полей, которые проверяться на пустоту. Нужно вносить в базу комбинированные записи. Если уже есть комбинация, то расширить ее по мере добавления новых записей.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Почему бы просто не взять массив id городов и не прогнать через мой (или другой) алгоритм?
     
  17. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Потому что я вношу эти города через поля.
    Проще говоря, мне нужно делать пары точек.
    Налоговая-Дом
    Налоговая-Офис
    Дом-Офис
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    У точек нет айдишников?
     
  19. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    База выглядит таким образом.
    0 - точка отправления, 1 - точка прибытия
    upload_2017-9-15_17-5-20.png
    --- Добавлено ---
    А что ты имел введу под этим?
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @Danil005 во-первых, когда у тебя в поля многократно вписаны одни и те же названия, это не структура, а фуфло (https://ru.wikipedia.org/wiki/Нормальная_форма)

    во-вторых
    PHP:
    1. $r = Array('Питер','Москва','Сочи');
    2. for ($offset = 0; $offset < sizeof($r); $offset++, reset($r)) {
    3.     for ($i = $offset; $i > 0; $i--, next($r));
    4.     for ($out = current($r); next($r); print $out . '-' . current($r) . '<br>');
    5. }
    Код (Text):
    1. Питер-Москва
    2. Питер-Сочи
    3. Москва-Сочи
     
  21. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Тут все нормально, ибо от Питера до Москвы свой километраж, от Питера до Сочи тоже и т.д.
    --- Добавлено ---
    Блин... То что ты написал, это подходит, кроме одного, но, если я введу еще одно название, он не сгруппируется со всеми по этому же принципу.
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нет, не нормально. Нормальная форма - это когда у тебя 300 км не от Питера до Москвы, а от 1 до 2. Не от Питера до Сочи, а от 1 до 3.
    ???
     
  23. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Да, но как я возьму иды например городских улиц и т.д.?
    Я делаю сайт для путевых листов.

    Что конкретно твоих "???". Говорю еще раз.
    Я написал: Ул.Красная и мне нужно, чтобы эта улица Красная была со всеми точками связанна.
    от ул. Красная до Питера
    от ул. Красная до Центр города
     
  24. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Так ты джойни
     
  25. Danil005

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

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Это глупый офтоп, нет, я не он. Просто не могут понять, что я хочу сделать. Пытаюсь объяснить и никто не понимает.)