Если же к начальному массиву добавить числа array(1,1,2,3,5,5,6), то вообще лажа Код (Text): Notice: Undefined offset: 5 in E:\www\test\temp\temp7.php on line 6 array(5) { [0]=> int(1) [1]=> int(1) [2]=> int(2) [3]=> int(3) [6]=> int(6) }
Код (Text): Notice: Undefined offset: 1 in E:\www\test\temp\temp7.php on line 5 Notice: Undefined offset: 6 in E:\www\test\temp\temp7.php on line 5 Notice: Undefined offset: 8 in E:\www\test\temp\temp7.php on line 5 array(3) { [2]=> int(2) [3]=> int(3) [7]=> int(6) } фикси ещё
Вечером, как дома буду. Добавлено спустя 5 минут 4 секунды: Хотя, а если так? Код (PHP): <?php $mass = array(1,1,2,3,4,5,5,6,4); for ($i = 0, $size = sizeof($mass); $i<$size; $i++){ while (true){ if (isset($mass[$i])){ $temp = array_search($mass[$i],$mass); if (($temp!==false) && ($temp!==$i)) { unset ($mass[$i], $mass[$temp]); } else{ break; } } else break; } } var_dump($mass); ?> Вроде больше негде такому нотису появиться. Добавлено спустя 2 минуты 15 секунд: Нагуглил, кстати, классную штуку: http://www.compileonline.com/execute_php_online.php И там сам проект дофига языков поддерживает.
И разница во времени увеличивается в геометрической прогрессии при увеличении исходного массива. Мне вот интересно, что так замедляет, array_count_values или array_diff Если передать такой массив Код (Text): $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): Array ( [2] => 2 [3] => 3 [16] => 60 ) vs Код (Text): Array ( [2] => 2 [3] => 3 [16] => 60 [27] => 40 ) Фикси ещё.
Ребят всем спасибо за ответы. По сути задача, если последний элемент массива уже имеется в наборе, удалить его и дубль. В итоге состряпал код. Работает! Возможно кому нибудь пригодится. В $_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); }
Хоть и не актуально для автора, но все же: Код (PHP): <?php $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); for ($i = 0, $size = sizeof($mass); $i<$size; $i++){ if (isset($mass[$i])){ $tmp = array_keys($mass,$mass[$i]); if (($tmp_size = sizeof($tmp))>1){ for($j = 0; $j<$tmp_size; $j++){ unset ($mass[$tmp[$j]]); } } } } echo '<pre>',print_r(($mass),true),'</pre>'; ?> Переписал по-другому. Добавлено спустя 7 минут 30 секунд: По скорости такая же, плюс минус погрешность. И лишена недостатков старой. Добавлено спустя 8 минут 39 секунд: Думаю, обе, но первая особенно. Первая прогоняет массив количество раз, равное его длине в квадрате. Вот тебе и пища для прогрессии. Вторая ищет пересечения множеств. И хотя для второго множества ты создаешь массив из одного элемента, она один фиг делает это через двойной цикл, тоже порождая какой-никакой оверхед.
Может кто знает. Есть строка $var = тапки,ботинки,кроссовки,туфли Все значения через запятую. Нужно сделать выборку всех id из таблицы shoes, где встречаются значения из строки. Да можно тупо explode "," потом $res = implode "AND category = " , а далее уже select id from shoes where stat = 'n' $res .... но может быть есть более простое решение?
Это не может работать. В строке $var значения через запятую. RLIKE будет искать всю строку в value, а значит ни найдет никогда.
Где встречается любое из слов? Логика подсказывает, что тапки не могут быть одновременно туфлями, то есть AND здесь не подходит. Понадобится условие вида x='a' OR x='b' OR x='c' или x IN('a','b','c')
Да верно, не AND а ||..... Про IN('a','b','c') уже думал, но в переменной $var все значения без кавычек, просто через запятую, а значит если поставить IN($var) результат будет ошибкой. Похоже без преобразований не обойтись никак (
у мну это делается так: Код (PHP): $arr = $db ->query("SELECT * FROM x WHERE y IN(:y)", ['y' => $array]) ->fetchAssocAll(); теперь не надо всякий раз любиться с массивами вручную. а кое-где даже так: Код (PHP): $iterator = $repo->findAll($array); foreach ($iterator as $obj) { echo $obj->name."\n"; // ... }
Код (PHP): $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); $newArray=array(); array_walk_recursive($array,function($key,$value) use (&$array,&$newArray) { $keys=array_keys($array,$key); if(1===sizeof($keys)) { $newArray[$keys[0]]=$key; } }); $array=$newArray; echo'<pre>',print_r($array,true),'</pre>'; /* Array ( [2] => 2 [3] => 3 [16] => 60 ) */ 0.00016999244689941 секунд А то и меньше... Можно даже расширить возможности а по скорости не будет значительно...
=) вы такие забавные Добавлено спустя 3 минуты 36 секунд: у меня твой код выдаёт как Скрипт отработал за 0.0001680851 сек. так и Скрипт отработал за 0.0003700256 сек. =)
Это ты забавен. Сравнивать надо два кода на одной машине. На том же сайте код your выдает что-то около 0.0001521111 сек. Что недалеко от того результата, который он сам же тут представил. Даже на грамм проворнее. Сомневаюсь, что Your при этом тестил на забитом Целкотроне-400мгц. В то время как мой код, в среднем, выдает 0.000045 сек. там же. Даже если не брать абсолютные значения, пропорциональная разница не может отрицаться.
Отрицание - первый шаг к осознанию проблемы. =) Предлагаю обговорить условия тестирования. Во-первых - выключить xdebug. В таком случае твой код будет выдавать: Скрипт отработал за 0.0000259876 сек. Скрипт отработал за 0.0000770092 сек. И пожалуйста, без истерик. Всё имеет свою причину. Надо копаться. Следующий вопрос программы, что за ключи у вас в массивах и зачем вам эти ключи, ибо банальный счетчик без ключей - ещё быстрее.
Игорь, речь идет не об абсолютном времени выполнения. А об пропорциональной разнице. Не на n микросекунд, а в n раз. Абсолютное время зависит от конкретного железа. А пропорция нет. Ты же понимаешь, что x и 2x - это просто когда одно больше другого в 2 раза, но этот самый X может быть любым? Однако, при этом чертов коэффицент 2 никуда не денется. З.Ы. На том сайтике хдебаг не включен и даже аккселераторов нет.