Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск элемента в массиве 
V
    Опции темы
namra
Дата 20.7.2013, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



Здравствуйте, использую вот такой код для заполнения массива, нужно чтобы в массиве не было повторяющихся значений и чтобы в массиве было 5 элементов. Использовал функцию in_array выдаает ошибки
Код

в массиве $mas - 10 элементов цифры разные
$test_mas = array();
     do
     {
       $rand_keys = array_rand($mas,1); // рандомно вытаскиваем по одному значению из массива 

         if (in_array($mas[$rand_keys]  , $test_mas))  // проверяем наличие элемента $mas[$rand_keys] в массиве $test_mas
          {
           echo "Существует";
          } else
          {
        $test_mas[] = $mas[$rand_keys];
          }
     }
     while ((count($test_mas))!=5); 

PM MAIL   Вверх
Arantir
Дата 20.7.2013, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



А зачем масив $mas?
В нем какие-то специальные значения или просто рандом?

Это сообщение отредактировал(а) Arantir - 20.7.2013, 17:39


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
namra
Дата 20.7.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



в нем спец значения взятые из бд
PM MAIL   Вверх
Arantir
Дата 20.7.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Ясно, тогда так

Код

$test_mas = $mas;
shuffle($test_mas);
$test_mas = array_slice($test_mas, 0, 5);


Это сообщение отредактировал(а) Arantir - 20.7.2013, 17:43


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
namra
Дата 20.7.2013, 18:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



я так понимаю ваш код меняет местами элементы массива, и сохраняет элементы с 0 по 5? а если в массиве будет 100 тыс. элементов перемешивать массиве разве будет не дольше, чем рандомно вытащить 5 элементов?

Это сообщение отредактировал(а) namra - 20.7.2013, 18:01
PM MAIL   Вверх
Arantir
Дата 20.7.2013, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(namra @  20.7.2013,  17:00 Найти цитируемый пост)
а если в массиве будет 100 тыс. элементов

Экстрасенса из меня делаете? Так и надо писать: "Нужен эффективный способ вытащить 5 случайных элементов из 100500 млрд.". Ну или, на худой конец, написать не "10 элементов", а "неопределенное неограниченное количество".

Цитата(namra @  20.7.2013,  17:00 Найти цитируемый пост)
массиве разве будет не дольше, чем рандомно вытащить 5 элементов?

А проверять 5 раз по 100 тыс. элементов через in_array() - это во сколько раз лучше?

Для начала я бы сказал, что 100 тыс. строк в массив Вы точно вытаскивать не будете. Скорее всего сервер просто убьет такой скрипт из-за излишнего потребления памяти.
Да и пользователю 100 тыс. строк за раз не покажешь, просто из разумных соображений.


Опишите чуть подробнее что за данные и в чем суть выборки 5 случайных значений. Я почти уверен, что это нетрудно сделать с помощью самой БД и получить сразу 5 желаемых строчек.

Добавлено @ 18:44
Если уж на то пошло, то почему Вы вытаскиваете по одному? Там второй аргумент не просто так присутствует.
Цитата(namra @  20.7.2013,  16:30 Найти цитируемый пост)
$rand_keys = array_rand($mas,1); // рандомно вытаскиваем по одному значению из массива 
         if (in_array($mas[$rand_keys]  , $test_mas))  // проверяем наличие элемента $mas[$rand_keys] в массиве $test_mas

Код

$rand_keys = array_rand($mas, 5);
foreach($random_keys as $key) {
    $test_mas[] = $mas[$key];

array_rand - не тупо генератор чисел. Его суть как раз в том, что выдает подмассив заданного массива. То есть. если в заданном массиве все значения уникальны, то и в полученном они будут такими же.

Но опять же, 100 тыс. строк лучше сразу на стороне БД обрабатывать. Да и даже 1000 передавать в PHP только ради выбора пяти - это не самый эффективный вариант.

Это сообщение отредактировал(а) Arantir - 20.7.2013, 18:46


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
namra
Дата 20.7.2013, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



про то что у array_rand  второй элемент не просто так а может быть и 5 и 10 я понял, просто я так понимаю, вытащил бы я 5 элементов и вот проверяю с помощью foreach что в нем есть повторяющийся элемент мне придется его убирать из $test_mas и заново случайным образом вытаскивать из массива $mas это же сколько действий, яподумал что проще вытаскивае элемент из массива $mas проверять есть ли элемент в массиве $test_mas и уе если нет присваивать этот элемент массиву $test_mas
PM MAIL   Вверх
Arantir
Дата 20.7.2013, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Хорошему ответу предшествует хороший вопрос.

Цитата(namra @  20.7.2013,  16:30 Найти цитируемый пост)
в массиве $mas - 10 элементов цифры разные

Цитата(namra @  20.7.2013,  20:40 Найти цитируемый пост)
вытащил бы я 5 элементов и вот проверяю с помощью foreach что в нем есть повторяющийся элемент

При использовании array_rand второе не имеет смысла, если имеет место первое...

array_rand($arr, 2) никогда не выберет Вам некое число больше раза, если в массиве $arr оно такое только одно.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
namra
Дата 20.7.2013, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



Цитата(Arantir @  20.7.2013,  22:38 Найти цитируемый пост)
array_rand($arr, 2) никогда не выберет Вам некое число больше раза, если в массиве $arr оно такое только одно.
 хм когда читал мануал не видел там такого просто было сказано что берет случайный элемент массива. Спс за подсказку 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1057 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.