За последние 24 часа нас посетили 57930 программистов и 1845 роботов. Сейчас ищут 1092 программиста ...

Массив

Тема в разделе "Сделайте за меня", создана пользователем sin313, 20 май 2014.

  1. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Если же к начальному массиву добавить числа array(1,1,2,3,5,5,6), то вообще лажа
    Код (Text):
    1. Notice: Undefined offset: 5 in E:\www\test\temp\temp7.php on line 6
    2. array(5) { [0]=> int(1) [1]=> int(1) [2]=> int(2) [3]=> int(3) [6]=> int(6) }
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    fixed постом выше.
     
  3. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (Text):
    1. Notice: Undefined offset: 1 in E:\www\test\temp\temp7.php on line 5
    2. Notice: Undefined offset: 6 in E:\www\test\temp\temp7.php on line 5
    3. Notice: Undefined offset: 8 in E:\www\test\temp\temp7.php on line 5
    4. array(3) { [2]=> int(2) [3]=> int(3) [7]=> int(6) }
    фикси ещё
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Вечером, как дома буду.

    Добавлено спустя 5 минут 4 секунды:
    Хотя, а если так?

    Код (PHP):
    1.   <?php
    2.   $mass = array(1,1,2,3,4,5,5,6,4);
    3.   for ($i = 0, $size = sizeof($mass); $i<$size; $i++){
    4.     while (true){
    5.     if (isset($mass[$i])){
    6.       $temp = array_search($mass[$i],$mass);    
    7.     if (($temp!==false) && ($temp!==$i)) { 
    8.       unset ($mass[$i], $mass[$temp]);
    9.       } else{
    10.            break; 
    11.       }
    12.     } else break;
    13.   }
    14.   }
    15. var_dump($mass);
    16. ?>
    Вроде больше негде такому нотису появиться.

    Добавлено спустя 2 минуты 15 секунд:
    Нагуглил, кстати, классную штуку: http://www.compileonline.com/execute_php_online.php
    И там сам проект дофига языков поддерживает.
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Твой код в 4 раза быстрей моего. Поздравляю.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Спасиб.
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    И разница во времени увеличивается в геометрической прогрессии при увеличении исходного массива.

    Мне вот интересно, что так замедляет, array_count_values или array_diff


    Если передать такой массив
    Код (Text):
    1. $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40);
    то на выходе результаты разные.
    Код (Text):
    1. Array
    2. (
    3.     [2] => 2
    4.     [3] => 3
    5.     [16] => 60
    6. )
    vs
    Код (Text):
    1. Array
    2. (
    3.     [2] => 2
    4.     [3] => 3
    5.     [16] => 60
    6.     [27] => 40
    7. )
    Фикси ещё.
     
  8. sin313

    sin313 Новичок

    С нами с:
    20 май 2014
    Сообщения:
    35
    Симпатии:
    0
    Ребят всем спасибо за ответы. По сути задача, если последний элемент массива уже имеется в наборе, удалить его и дубль. В итоге состряпал код. Работает! Возможно кому нибудь пригодится. В $_GET['category'] находятся значения через запятую типа 40,41,42,40. На выходе имеем 41,42.
    if(isset($_GET['category'])) {
    $cat1 = $_GET['category'];
    $cat2 = explode(",",$cat1);
    $c = count($cat2)-1;
    $t = array_search($cat2[$c],$cat2);
    if($c != $t) { unset($cat2[$t]); array_pop($cat2);}
    $cat = implode(",",$cat2);
    }
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это уже точно вечером. Потому что ухожу с работы уже.
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Хоть и не актуально для автора, но все же:

    Код (PHP):
    1. <?php
    2. $mass = array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40);
    3. for ($i = 0, $size = sizeof($mass); $i<$size; $i++){
    4.     if (isset($mass[$i])){
    5.         $tmp = array_keys($mass,$mass[$i]);
    6.  
    7.         if (($tmp_size = sizeof($tmp))>1){
    8.             for($j = 0; $j<$tmp_size; $j++){
    9.                 unset ($mass[$tmp[$j]]);
    10.             }
    11.         }
    12.     }
    13. }
    14. echo '<pre>',print_r(($mass),true),'</pre>';
    15. ?>
    Переписал по-другому.

    Добавлено спустя 7 минут 30 секунд:
    По скорости такая же, плюс минус погрешность. И лишена недостатков старой.

    Добавлено спустя 8 минут 39 секунд:
    Думаю, обе, но первая особенно. Первая прогоняет массив количество раз, равное его длине в квадрате. Вот тебе и пища для прогрессии.

    Вторая ищет пересечения множеств. И хотя для второго множества ты создаешь массив из одного элемента, она один фиг делает это через двойной цикл, тоже порождая какой-никакой оверхед.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Не проще счетчик банальный сделать со значениями в кач-ве ключей?
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Смотри код Исандро.
     
  13. sin313

    sin313 Новичок

    С нами с:
    20 май 2014
    Сообщения:
    35
    Симпатии:
    0
    Может кто знает. Есть строка $var = тапки,ботинки,кроссовки,туфли
    Все значения через запятую. Нужно сделать выборку всех id из таблицы shoes, где встречаются значения из строки. Да можно тупо explode "," потом $res = implode "AND category = " , а далее уже select id from shoes where stat = 'n' $res .... но может быть есть более простое решение?
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    WHERE value LIKE %$var%
     
  15. sin313

    sin313 Новичок

    С нами с:
    20 май 2014
    Сообщения:
    35
    Симпатии:
    0
    Это не может работать. В строке $var значения через запятую. RLIKE будет искать всю строку в value, а значит ни найдет никогда.
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Где встречается любое из слов? Логика подсказывает, что тапки не могут быть одновременно туфлями, то есть AND здесь не подходит.
    Понадобится условие вида x='a' OR x='b' OR x='c' или x IN('a','b','c')
     
  17. sin313

    sin313 Новичок

    С нами с:
    20 май 2014
    Сообщения:
    35
    Симпатии:
    0
    Да верно, не AND а ||..... Про IN('a','b','c') уже думал, но в переменной $var все значения без кавычек, просто через запятую, а значит если поставить IN($var) результат будет ошибкой. Похоже без преобразований не обойтись никак (
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Эксплод + имплод
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    у мну это делается так:
    Код (PHP):
    1. $arr = $db
    2.   ->query("SELECT * FROM x WHERE y IN(:y)", ['y' => $array])
    3.   ->fetchAssocAll();
    теперь не надо всякий раз любиться с массивами вручную.

    а кое-где даже так:
    Код (PHP):
    1. $iterator = $repo->findAll($array);
    2. foreach ($iterator as $obj) {
    3.   echo $obj->name."\n";
    4.   // ...
    5. } 
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $array=array(1, 1, 2, 3, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40, 50, 50, 60, 40, 4, 5, 5, 6, 4, 1, 1, 20, 30, 40);
    2. $newArray=array();
    3. array_walk_recursive($array,function($key,$value) use (&$array,&$newArray) {
    4.     $keys=array_keys($array,$key);
    5.     if(1===sizeof($keys)) {
    6.         $newArray[$keys[0]]=$key;
    7.     }
    8. });
    9. $array=$newArray;
    10. echo'<pre>',print_r($array,true),'</pre>';
    11. /*
    12. Array
    13. (
    14.     [2] => 2
    15.     [3] => 3
    16.     [16] => 60
    17. )
    18. */
    19.  
    0.00016999244689941 секунд
    А то и меньше...
    Можно даже расширить возможности а по скорости не будет значительно...
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Долго. За такое время можно успеть страницу отдать.
    Надо на порядок быстрее, минимум.
    [​IMG]
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    =) вы такие забавные

    Добавлено спустя 3 минуты 36 секунд:
    у меня твой код выдаёт как
    Скрипт отработал за 0.0001680851 сек.
    так и
    Скрипт отработал за 0.0003700256 сек.

    =)
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это ты забавен. Сравнивать надо два кода на одной машине. На том же сайте код your выдает что-то около 0.0001521111 сек. Что недалеко от того результата, который он сам же тут представил. Даже на грамм проворнее. Сомневаюсь, что Your при этом тестил на забитом Целкотроне-400мгц. В то время как мой код, в среднем, выдает 0.000045 сек. там же.

    Даже если не брать абсолютные значения, пропорциональная разница не может отрицаться.
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Отрицание - первый шаг к осознанию проблемы. =)
    Предлагаю обговорить условия тестирования. Во-первых - выключить xdebug.

    В таком случае твой код будет выдавать:
    Скрипт отработал за 0.0000259876 сек.
    Скрипт отработал за 0.0000770092 сек.

    И пожалуйста, без истерик. Всё имеет свою причину. Надо копаться.

    Следующий вопрос программы, что за ключи у вас в массивах и зачем вам эти ключи, ибо банальный счетчик без ключей - ещё быстрее.
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Игорь, речь идет не об абсолютном времени выполнения. А об пропорциональной разнице. Не на n микросекунд, а в n раз. Абсолютное время зависит от конкретного железа. А пропорция нет.

    Ты же понимаешь, что x и 2x - это просто когда одно больше другого в 2 раза, но этот самый X может быть любым? Однако, при этом чертов коэффицент 2 никуда не денется.

    З.Ы. На том сайтике хдебаг не включен и даже аккселераторов нет.