0

I have 2 functions

This one generates numbers only

//Generate a string of only numbers.
function GenerateNUM($length)
{
    $alphabet = '1234567890';
    $tip = array();
    $alphaLength = strlen($alphabet) - 1;
    for ($i = 0; $i < $length; $i ++) {
        $n = rand(0, $alphaLength);
        $tip[] = $alphabet[$n];
    }
    return implode($tip);
}

This one generates numbers and letters

//Generate a string of numbers and letters.
function GenerateAll($length)
{
    $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
    $pass = array();
    $alphaLength = strlen($alphabet) - 1;
    for ($i = 0; $i < $length; $i ++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
    }
    return implode($pass);
}

and I call it like this

$ValidationCode = GenerateNUM(12);

or this

$ValidationCode = GenerateAll(12);

It works great but my question is do I really need 2 blocks of code? is there a way to create one function and be able to decide if numbers and letters are called or just numbers? or am I over thinking it?

5
  • Did you try GenerateStuff($length,$type) ... ? then just branch inside the function on $type? Nothing wrong with multiple small utility functions though. The naming keeps them clean and obvious their intent. But if you have a LOT of duplicated code between a bunch of utility functions, then you can combine them with a second parameter and adjusting small pieces inside based on that param. Commented Feb 3, 2018 at 15:15
  • I had not tried that but for type how would i exclude one or the other? Commented Feb 3, 2018 at 15:17
  • So if I put ALPHA it would only do alpha and if I put Num it with only generate num automatically? Commented Feb 3, 2018 at 15:19
  • but sometimes i would want to generate all together Commented Feb 3, 2018 at 15:21
  • See my example in the answer to combine. If you wish to combine. Commented Feb 3, 2018 at 15:23

1 Answer 1

0

Example of a combined singular function based off your code:

function GenerateCode($length,$type='ALPHA')
{
    $alphabet = (($type == 'ALPHA')?'ABCDEFGHIJKLMNOPQRSTUVWXYZ':'') .'1234567890';
    $code = array();
    $alphaLength = strlen($alphabet) - 1;
    for ($i = 0; $i < $length; $i ++) {
        $n = rand(0, $alphaLength);
        $code[] = $alphabet[$n];
    }
    return implode($code);
}

$ValidationCode = GenerateCode(12,'NUM');// just makes a numbers only code
$ValidationCode = GenerateCode(12,'ALPHA');// makes an alphanumeric code

But there is nothing wrong with multiple small utility functions though. The naming keeps them clean and obvious their intent. However if you have a LOT of duplicated code between a bunch of utility functions, then you can combine them with a second parameter and adjusting small pieces inside based on that param (like above).


A slightly better example of generating a random string like your function (includes upper and lower case lettering):

function GenerateCode($length,$type='ALPHA')
{
    $string = '';
    for ($n=1; $n <= $length; $n++) {
        if ($type == 'NUM') {
            $string .= mt_rand(0,9);
        } else {
            $randnum = mt_rand(0,61);
            $string .= ( ($randnum < 10) ? chr($randnum+48) :  // number chr 48 - 57
                        (($randnum < 36) ? chr($randnum+55) :  // upperletter chr 65 - 90
                                           chr($randnum+61) ));// lowerletter chr 97 - 122
        }
    }
    return $string;
}

// example GenerateCode(12,'ALPHA') output: XNu1n833b2ox
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.