есть массив users, ключ содержит id, а значение ip адрес юзеров. надо создать другой массив из id юзеров, которые ip адреса повторяются. т.е. $users = array( 1 => '127.0.0.1', 2 => '127.0.0.2', 3 => '127.0.0.1', 4 => '127.0.0.3', 5 => '127.0.0.3', 6 => '127.0.0.4'); $mustdieusers = array(1, 3, 4, 5); заранее спасибо.
м? PHP: <? $users = array( 1 => '127.0.0.1', 2 => '127.0.0.2', 3 => '127.0.0.1', 4 => '127.0.0.3', 5 => '127.0.0.3', 6 => '127.0.0.4'); $mustdieusers=array(); foreach($users as $key=>$val) { foreach($users as $k=>$v) { if (md5($v)==md5($val) && $key!==$k && !in_array($key,$mustdieusers)) { $mustdieusers[]=$key; break; } } } ?>
Так попроще) Код (Text): <?php $users = array(1 => '127.0.0.1', 2 => '127.0.0.2', 3 => '127.0.0.1', 4 => '127.0.0.3', 5 => '127.0.0.3', 6 => '127.0.0.4'); $bad_users = array(); foreach($users as $k => $user) { $tmp_arr = $users; unset($tmp_arr[$k]); if(in_array($user, $tmp_arr)) { $bad_users[] = $k; } } var_export($bad_users); ?>
Может что-то типа PHP: <?php $clear_u = array_unique($users); //Вернет 1, 2, 4, 6 $copys = array_diff_assoc($users, $clear_u); //Вернет 3, 5 while (list($key, $value) = each($copys)) { $index = array_search($value, $clear_u ); //Вернет 1 и 4 $copys[$index] = $clear_u[$index]; } sort($copys); ?> Пока писал, уже два варианта накатали
Еще один вариант PHP: <?php $values = array_count_values($users); //Получаем 127.0.0.1 => 2, 127.0.0.2 => 1, 127.0.0.3 => 2, 127.0.0.4 => 1 foreach ($values as $key => $value) { if ($value > 1) { $tmp_array = array_keys($users, $key); //Получаем Array (1,3), Array (4,5) for ($i = 0; $i < sizeof($tmp_array); $i++) { $multiusers[$tmp_array[$i]] = $users[$tmp_array[$i]]; } } } ?> Программирование - интересная штука)
PHP: <?php $users = array( 1 => '127.0.0.1', 2 => '127.0.0.2', 3 => '127.0.0.1', 4 => '127.0.0.3', 5 => '127.0.0.3', 6 => '127.0.0.4' ); $mustdieusers = array(); foreach ($users as $id => $ip) { if (count(array_keys($users, $ip)) > 1) { $mustdieusers[] = $id; } } print_r($mustdieusers);
PHP: <? $users = array( 1 => '127.0.0.1', 2 => '127.0.0.2', 3 => '127.0.0.1', 4 => '127.0.0.3', 5 => '127.0.0.3', 6 => '127.0.0.4'); $mustdieusers = array_keys(array_intersect($users,array_keys(array_filter(array_count_values($users),create_function('$o', 'return $o>1;'))))); просто так - до кучи
Время исполнения скриптов (доли секунды): Код (Text): Mr.M.I.T. = 9.3936920166E-5 NOmeR1 = 4.19616699219E-5 Sergey89 = 4.41074371338E-5 nimistar = 6.103515625E-5 Победитель - NOmeR1 P.S. Скрипт крекера выдавал ошибку
NOmeR1 простой вынос функции фильтрации PHP: # <? function c($v){ return $v>1; } $users = array( 1 => '127.0.0.1', 2 => '127.0.0.2', 3 => '127.0.0.1', 4 => '127.0.0.3', 5 => '127.0.0.3', 6 => '127.0.0.4'); $mustdieusers = array_keys(array_intersect($users,array_keys(array_filter(array_count_values($users),'c')))); и Код (Text): 3.4093856811523
PHP: <?php $mustdieusers = array(); foreach (array_count_values($users) as $ip => $count) { if ($count > 1) { $mustdieusers = array_merge($mustdieusers, array_keys($users, $ip)); } } Всё сильно зависит от условий. Этот метод будет очень быстрым, когда много уникальных IP адресов или наоборот много повторяющихся. p.s. можете провести тест на большом массиве прогнав каждый метод в цикле 100 раз.
Sergey89 неполенился проверил - ну не ста записях, но на 30 записях в масиве юзерс! (интераций 1000) Код (Text): А = min: 0.00011897; max: 0.00179291; average: 0.00013030 Б = min: 0.00005507; max: 0.00031090; average: 0.00005847 и на 6 записях Код (Text): А = min: 0.00001383; max: 0.00019503; average: 0.00001647 Б = min: 0.00001502; max: 0.00014997; average: 0.00001648 где А - твой код а Б - мой ... а вообщем шляпа ... если рассмотреть в деталях ... то там распределение затрат идет следующим образом - первый раз всегда долго - потом быстро (иногда вкрапления долго, очень) П.С.: я это к тому что стоит пытаться исполнять код на встроенных процедурах, у них запас мощности несравнимо выше!
Странно, но но у меня другие цифры Код (Text): // 6 A: 0.00784 B: 0.00889 // 1000 A: 0.04183 B: 0.13853
Еще один вариант PHP: <?php $tmp_array = Array(); while (list($key, $value) = each($users)) { $id = array_search($value, $tmp_array); if ($id !== false) { $multiusers[$id] = $value; $multiusers[$key] = $value; } $tmp_array[$key] = $value; } sort($multiusers); ?>