проблема петли php - PullRequest
       4

проблема петли php

1 голос
/ 29 июня 2011

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

Мой код

       //Generates a random five digit alphanumerical id
       $aliasId = $model->random_id_gen('5');

       //calls the active record class for table Person                     
       $person = new Person();

       //searches the person table to see if this alias is being used         
       $search = $person->find('alias=:alias', array(':alias'=>$aliasId));

       //if null then it sets an attribute for a another active record class                     
       if ($search==NULL)
       {
               $model->setAttribute('alias', $aliasId);
               $model->setIsNewRecord(TRUE);
       }
       else
       {
       //I need to loop through the above code until I find an alias that isn't being used                            
       }

Мой вопрос

Что я пишу в операторе else для выполнения кода выше, пока не найду псевдоним, который не используется в таблице Person.Я думаю, что это своего рода петля, но я просто не совсем уверен, как это сделать.Не стесняйтесь переделывать это, как вам нравится.Поставь это как свою функцию / скажи мне, что я делаю это неправильно, я не буду обижаться.Спасибо ТАК!

Ответы [ 4 ]

1 голос
/ 29 июня 2011
$found = false;
$iter = 0;        // It's a good idea to include an upper bound on the number of iterations
while(!$found && $iter < 1000){
   $aliasId = $model->random_id_gen('5');

   //calls the active record class for table Person                     
   $person = new Person();

   //searches the person table to see if this alias is being used         
   $search = $person->find('alias=:alias', array(':alias'=>$aliasId));

   //if null then it sets an attribute for a another active record class                     
   if (is_null($search)){
       $model->setAttribute('alias', $aliasId);
       $model->setIsNewRecord(TRUE);
       $found = true;
   }
   $iter++;
}

if(!$found){ /* Some error condition because a suitable ID could not be found*/ }

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

Для преобразования числа в base36 вы можете использовать функцию PHP * base_convert :

$a = base_convert(12345,10,36);
$b = base_convert($a,36,10);
print "12345 --> ".$a."  --> ".$b;

вывод:

12345 --> 9ix  --> 12345

Если вы хотите убедиться, что ваш номер состоит не менее чем из 5 цифр, начните увеличивать значение с: base_convert(10000,36,10) = 1679616

0 голосов
/ 29 июня 2011

Моя версия с настройкой максимальной итерации (установите -1, если вы хотите, чтобы она работала, пока не найдет уникальный)

$person = new Person();
$unique = false;
$maxloops = 100;
while($maxloops>=0){
    //Generates a random five digit alphanumerical id
    $aliasId = $model->random_id_gen('5');
    //searches the person table to see if this alias is being used
    $unique = empty($person->find('alias=:alias', array(':alias'=>$aliasId)));         
    if($unique) break;
    $maxloops--;
}

if($unique){
    $model->setAttribute('alias', $aliasId);
    $model->setIsNewRecord(TRUE);
}else{
    trigger_error("oops!");
}
0 голосов
/ 29 июня 2011

Я бы пошел с циклом while ...

//calls the active record class for table Person                     
$person = new Person();

//Generates a random five digit alphanumerical id
$aliasId = $model->random_id_gen('5');

while ($person->find('alias=:alias', array(':alias'=>$aliasId)))
{
    $aliasId = $model->random_id_gen('5');
}
//sets an attribute for a another active record class                     
$model->setAttribute('alias', $aliasId);
$model->setIsNewRecord(TRUE);

Я бы действительно искал лучший способ для генерации значения aliasId, потому что, как только у вас будет много «персональных» записей, вы будете долго зацикливаться.

0 голосов
/ 29 июня 2011

Как насчет этого:

$search = true; //set to a non-null value
while (!is_null($search)) {
    $aliasId = $model->random_id_gen('5');

    //calls the active record class for table Person                     
    $person = new Person();

    //searches the person table to see if this alias is being used         
    $search = $person->find('alias=:alias', array(':alias'=>$aliasId));
}
$model->setAttribute('alias', $aliasId);
$model->setIsNewRecord(TRUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...