Как добавить случайное слово из словаря?

Добрый день. Хочу сделать так, чтобы при добавлении поста на сайт название формировалось из случайного слова или фразы (из моего словаря - набора слов) и тегов. Сейчас я сделал так, чтобы название поста создавалось из категорий и тегов, но очень часто названия постов дублируются.

<?php

namespace Submitters;

use App;
use User;
use Lang;

class Submitter {
   
   use \Purify;
   use \Prepare;
   use \Stats;
   
   protected $app;
   protected $sql;
   protected $raw;
   protected $type;
   protected $post;
   protected $user;
   protected $notes;
   protected $output;

   public function __construct(App $app, $type) 
   {

      $this->app     = $app;
      $this->sql     = $app->make('db');
      $this->user    = $app->make('user');
      $this->http    = $app->make('http');
      $this->note    = $app->make('notes');
      $this->config  = $app->make('config');
      $this->web     = $app->make('webdata');

      $this->submissionDisabled();
      User::can('submit.content') ?: App::Redirect();

      $this->type = $this->postType($type);
      $this->output = $this->prepareData();
      
      App::createTempdirDir();
      $this->execute();
   }

   private function submissionDisabled() {
      $can = $this->config->get('disable_submission') && ! User::isAdmin();
      $can && die( Lang::get('submission_disabled') );
   }
   
   protected function countTags($tags) {
      $tagsArray = array_map('trim', explode(',',$tags));
      if ($this->config->get('tags_limit') && (sizeof($tagsArray) > $this->config->get('tags_limit')) ) {
         die(Lang::get('maxtags_error'));
      }
   }
   
   protected function addTags($tags) {
      $tagsArray = array_map('trim', explode(',',$tags));
      foreach ($tagsArray as $tag) { if (empty($tag)) continue;
         if (!$this->sql->countRows('tags', 'keyword=?', $tag)) {
            $this->sql->insert('tags', ['keyword' => $tag]);
         }
      }
   }

   private function isDraft() {
      return $this->post('saveas') === "draft";
   }
   
   private function prepareData() {

      $username = $this->user->get('username', $this->post('nick'));

      $input = filter_input_array(INPUT_POST, [
          'title'    => [
              'filter' => FILTER_SANITIZE_STRING,
              'flags'  => FILTER_FLAG_STRIP_LOW
          ],
          'category' => [
            'filter'  => FILTER_SANITIZE_STRING, 
            'default' => ''
          ],
          'tags'     => [
              'filter'  => FILTER_CALLBACK, 
              'options' => function($json) { 
                  return $this->prepareTags($json);
              }
          ],
          'desc'     => [
              'filter'  => FILTER_CALLBACK, 
              'default' => '',
              'options' => function($desc) { 
                  return $this->purifyDescription($desc);
              }
          ]
      ]);












      return (object) array_merge($input, [
          'time'   => time(),
          'type'   => $this->type,
          'logged' => $this->user->logged,
          'status' => $this->getUserStatus(),
          'user'   => $this->isValid('user', $username),


          'title'  => $this->isValid('title', $input['category']. ' ' .$input['tags'])


          //'title'  => $this->isValid('title', $input['title'])
      ]);
      
   }


















   
   private function getUserStatus() {

      if ($this->isDraft()) { return -1; }
      
      /* -------------------------------------------

      -2 - Hidden     // Visibility: invisible
      -1 - Draft      // Visibility: invisible
       0 - Moderation // Visibility: invisible
       1 - Moderation // Visibility: profiles
       2 - Published  // Visibility: everywhere

      */
      
      $conf = $this->config->find('in_profile,autoaccept');
      
      if ($this->user->logged) {
         if ($this->user->isadmin || $conf->autoaccept) { return 2; }
         if ($conf->in_profile) { return 1; }
      }
      
      return 0;

   }
   
   private function isValid($field, $value) {

      $i = 0; $error = 0;
      $ruleset = $this->getRules( $field );
      
      if ($ruleset) {
         
         foreach ( $ruleset as $rule => $cond ) {
            
            switch ($rule) {
               case 'not_empty': if (empty($value)) { $error++; } break;
               case 'regex_test': if (!preg_match($cond[0], $value)) { $error++; } break;
               case 'min_length': if (strlen($value) < $cond[0]) { $error++; } break;
               case 'max_length': if (strlen($value) > $cond[0]) { $error++; } break;
               case 'callback': 
                  $fieldnc = (gettype($cond) === 'array') ? $cond[0] : $cond;
                  if (call_user_func($fieldnc, $value)) { $error++; } break;
            } 
            
            if ($error) { 
               $info = $cond[1];
               die($this->Error($info) ?: $info);
            } 
            
            $i++; 

         } // END loop
         
      } // if $ruleset
      
      if (! $error) return $value;
      
   }
   
   private function getRules($field) {
      
      $rules = [

         'user' => [
            'not_empty' => [ true, Lang::get('empty_username') ],
            'min_length' => [ $this->config->get('user_minlen') , Lang::get('user_minlen') ],
            'max_length' => [ $this->config->get('user_maxlen') , Lang::get('user_maxlen') ],
            'regex_test' => [ '/^[0-9A-Za-z_-]+$/i' , Lang::get('login_invalid') ],
            'callback' => function($value) {
                if (! $this->user->logged && User::userExists($value) ) {
                    $this->Error('username_taken');
                }
            }
         ],

         'title' => [
            'not_empty' => [ true, Lang::get('empty_title') ],
            'min_length' => [ $this->config->get('title_minlen') , Lang::get('title_minlen') ],
            'max_length' => [ $this->config->get('title_maxlen') , Lang::get('title_maxlen') ]
         ]

      ];
      
      return isset($rules[ $field ]) ? $rules[ $field ] : false;
     
   }
  
   protected function mkSaveDir($dir) {
     if (!is_dir($dir)) {
        $oldmask = umask(0);
        mkdir($dir, 0777, true);
        umask($oldmask);
      }
   }
   
   protected function makeFolder($postID) {
      
      $date = DATE . '/' . $postID;
      $path = SAVE_DIR . '/' . $postID;
      $save = PATH_SAVE .'/'. $postID;
      
      $this->mkSaveDir($save);
      
      return (object) ['save' => $save, 'date' => $date, 'path' => $path];

   }
   
   protected function moveFiles($destination) {
      foreach (glob(PATH_TEMP.'/*') as $file) {
         rename($file, $destination .'/'. basename($file));
      } return glob( $destination .'/*' );
   }
   
   protected function clearFolder() {
      if ( is_dir(PATH_TEMP) ) {
         $files = glob(PATH_TEMP . '/*');
         foreach( $files as $file ) {
            if ( is_file($file) ) { unlink($file); }
         } @rmdir(PATH_TEMP);
      }
   }
   
   private function postType($type) {
      $types = ['article', 'gif', 'gifimg','photos', 'video','audio','embed'];
      return in_array($type, $types) ? $type : exit;
   }
   
   protected function Error($e) {

      $error = [
         'no_images' => Lang::get('art_add_photo'), 
         'submit_error' => Lang::get('post_submit_error'),
         'title_invalid' => Lang::get('title_invalid_chars'),
         'img_invalid_url' => Lang::get('img_invalid_url'),
         'title_min_length' => Lang::get('title_minlen'),
         'login_used' => Lang::get('username_taken'),
         'login_invalid' => Lang::get('login_invalid'),
         'user_min_len' => Lang::get('user_minlen'),
         'user_max_len' => Lang::get('user_maxlen'),
         'desc_length' => Lang::get('art_too_short'),
      ]; 
      
      if (isset($error[$e])) { die($error[$e]); }
      return false;

   }
   
} // END Class

Я сделал так, чтобы название поста создавалось из категорий и тегов, но очень часто названия постов дублируются.

'title'  => $this->isValid('title', $input['category']. ' ' .$input['tags'])

Пожалуйста, отредактируйте свой код до минимально воспроизводимого примера. Насколько я понимаю, вы спрашиваете о рандомизации в одном из свойств поста. Вся ваша обработка ошибок, обработка типа файла и т. д. не имеют отношения к проблеме.

LokiRagnarok 23.04.2024 08:56

Сколько возможных вариантов у вас есть? Увеличьте количество возможных категорий и тегов до 10 000 000 000, чтобы получить больше случайных значений. В остальном — проверьте, существует ли эта комбинация, и если да — повторите рандомизацию.

Justinas 23.04.2024 08:56

Нет, много категорий не вариант. Я хочу добавить случайное слово из словаря вместо категорий. Мне просто нужно придумать, куда его положить. Будет около 10 слов. Как убрать код под спойлер?

Алексей 23.04.2024 09:03

Каков ваш актуальный вопрос? В чем ваша настоящая проблема? Ваш код тоже не особо помогает, потому что он неполный и есть вещи, которые, вероятно, не используются.

Ulrich Eckhardt 23.04.2024 11:56

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

phatskat 24.04.2024 19:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Привет, я думаю, тебе стоит попробовать это:

protected function prepareData() {
  $username = $this->user->get('username', $this->post('nick'));

  $input = filter_input_array(INPUT_POST, [
    'title'    => [
        'filter' => FILTER_SANITIZE_STRING,
        'flags'  => FILTER_FLAG_STRIP_LOW
    ],
    'category' => [
        'filter'  => FILTER_SANITIZE_STRING, 
        'default' => ''
    ],
    'tags'     => [
        'filter'  => FILTER_CALLBACK, 
        'options' => function($json) { 
            return $this->prepareTags($json);
        }
    ],
    'desc'     => [
        'filter'  => FILTER_CALLBACK, 
        'default' => '',
        'options' => function($desc) { 
            return $this->purifyDescription($desc);
        }
    ]
]);

// Generate a random word or phrase from your dictionary
$randomWord = $this->getRandomWordFromDictionary(); // Implement this method

// Combine the random word, category, and tags to form the title
$title = $randomWord . ' ' . $input['category'] . ' ' . $input['tags'];

return (object) array_merge($input, [
    'title'  => $this->isValid('title', $title),
    'time'   => time(),
    'type'   => $this->type,
    'logged' => $this->user->logged,
    'status' => $this->getUserStatus(),
    'user'   => $this->isValid('user', $username)
]);

}

Спасибо за подсказку, теперь осталось добавить саму функцию. Я делаю это, но не добавляю ни слова. ------- Private function getRandomWordFromDictionary() { $randomWords = array("1", "2", "3", "4", "5"); $randomWord = array_rand($randomWords, 1); }

Алексей 23.04.2024 12:23
Ответ принят как подходящий

Вот функция:

private function getRandomWordFromDictionary() {
    $randomWords = array("apple", "banana", "orange", "grape", 
    "pineapple");
    
    $randomIndex = array_rand($randomWords, 1);
    $randomWord = $randomWords[$randomIndex];
    
    // Return the randomly chosen word
    return $randomWord;
}

Кажется, этот ответ соответствует тому, о чем просил автор. Учитывая, что они не были слишком уверены в том, каким может быть решение, ваш ответ можно было бы улучшить, предоставив некоторое объяснение того, что делает ваш код - либо через встроенные комментарии, либо предоставив пояснительный текст к вашему ответу.

phatskat 24.04.2024 19:05

Другие вопросы по теме