как вывести случайные строки из файла

Тема в разделе "PHP", создана пользователем verfaa, 23 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    Есть файл с кеями. Кейворды по одному на строку, кеев много.
    Мне нужно вывести заданное количество случайных кеев из файла.

    Как я понимаю, нужно занести файл в массив и добавить этот массив в переменную.

    Код:
    $filewithkeys = file(d:\cars\bmw.txt);
    
    А как теперь вывести допустим 50 случайных кеев из массива $filewithkeys в переменную $randomkeys ?
     
  2. lucky_priest

    lucky_priest Создатель

    Регистр.:
    16 ноя 2009
    Сообщения:
    20
    Симпатии:
    7
    PHP:
    $size sizeof($filewithkeys);
    $used_numbers = array();
    $randomkeys = array();
    for (
    $i=0$i<50$i++) {
        
    //это чтобы не было повторов
        
    $number rand(0$size);
        while (
    arry_search($number$used_numbers) !== false$number rand(0$size);
        
    $used_numbers[] = $number;
        
    //==========================
        
    $randomkeys[] = $filewithkeys[$number];
    }
     
    verfaa нравится это.
  3. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    считаю, что для получения случайного элемента массива, лучше использовать соответствующую функцию array_rand()
    PHP:
    $key=array_rand($filewithkeys,50);
    for (
    $i=0$i<50$i++) {
    echo 
    $filewithkeys[$key[$i]].'<br>';
    }
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    PHP:
    $keys file('key.txt');
    shuffle($keys);
    $random_keys array_slice($keys050);
    foreach(
    $random_keys as $key){
        echo 
    $key.' ';
    }  
     
  5. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    polyetilen
    зачем писать на не сильно быстром PHP преднамерено более медленные скрипты?
    При выборке k элементов из массива размерностью N, моим способом на это уйдет O(k), а в вашем на перемещивание уйдет O(N), и на выборку O(k)
    O(k)<O(N)+O(k)
    Так что при больших массивах, и небольших выборках, ваш способ просто пальба из пушки по воробьям
     
  6. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    371
    Симпатии:
    41
    Т.к. сообщение с ответом потерялось, подскажите ещё раз как быть в случае, если после того, как случайные кеи выбраны нужно после каждого 3-го кея поставить запятую, после каждого 5-го точку, после каждого 8-го двоеточие, после 12-го тег <br />. И чтобы первый кей в выборке начинался с большой буквы и все кеи которые будут идти после кея с точкой тоже начинались бы с большой буквы. Таким образом я хочу получить некое подобие с текстом :)
     
  7. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    интересно, зачем было терять этот пост. и почему вы его не скопировали себе пока видели?))
    придется снова сочинять:
    PHP:
    <?
    $keys=file('key.txt');
    $count_key=50;//количество кеев
    $znaki=array(//через сколько слов знак ставить
        //в порядке важности. то есть сперва будет применятся первое правило, а остальные соотвественно нет, в случае удачи
        //лучше всего по уменьшению частоты расставить
        
    '<br/>'=>12,
        
    ': '=>8,
        
    '. '=>5,
        
    ', '=>3,
        
    ' '=>//не удалять.означает, что если не был поставлен знак препинания, то будет пробел поставлен
        
    );
    $ucfirst=array('. '=>0,'<br/>'=>0);//после какого знака увеличивать надо
    $key_rand=array_rand($keys,$count_key); 
    $str=(ucfirst($keys[$key_rand[0]]).' ');
    for(
    $i=1;$i<$count_key;$i++)
        {
        
    $t=true;
        foreach(
    $znaki as $key=>$value)
            {
            if(
    $i%$value==0)
                {
                
    $str.=($key.(isset($ucfirst[$key])?ucfirst($keys[$key_rand[$i]]):$keys[$key_rand[$i]]));
                
    $t=false;
                break;
                }
            } 
        }
    echo 
    $str;
    ?>
     
    zloi нравится это.
Статус темы:
Закрыта.