Location: PHPKode > scripts > Bitwise Flags > example.php
<?php
include('Flags.class.php');
session_start();
$statusList = array();

/**
 * In this example, the page allows the viewer to specify the number of flags, meaning
 * we need to retrieve the number of flags from the session as well as check for a change
 * in that number (through the form provided).
 * We also store the number of flags in the session for further page views.
**/
if(is_array($_SESSION) && array_key_exists('flagnum',$_SESSION)) {
    $numberOfFlags = $_SESSION['flagnum'];
} else {
    $numberOfFlags = 62;
}
if(is_array($_POST) && array_key_exists('flagnumsub',$_POST)) {
    $numberOfFlags = (int)$_POST['numberofflags'];
}
$_SESSION['flagnum'] = $numberOfFlags;


/**
 * Generate the flag name list.
 * For the purposes of this example, flags are generated dynamically using
 * a naming template (fXX where XX is the flag number).
**/
for($i=count($statusList);$i<$numberOfFlags;$i++) {
    $statusList[$i] = 'flag'.($i+1);
}

/**
 * Create our flags class...
**/
$state = new Flags($statusList);

/**
 * First off, because the example requires multiple page loads, we check to see if
 * the session is currently holding any flag data.
 * 
 * If it is, we load that data into the flags class.
 * 
 * If not, we set the initial values to true (which showcases the maximum footprint
 * of the class).
**/
if(is_array($_SESSION) && array_key_exists('flags',$_SESSION)) {
    // Load flags from session
    $state->setData($_SESSION['flags']);
} else {
    // Set all flags to true.
    for($i=0,$l=count($statusList);$i<$l;$i++) {
        $state->{$statusList[$i]} = true;
    }
}

/**
 * Because we allow the viewer to toggle the flag state, we now loop through and check
 * to see if it was toggled. If it is, toggle it. Otherwise, nothing happens.
 * 
 * ------------------------------------------------------------------------------------
 * 
 * Be aware that this example only toggles flags. You can also set flags to an explicit
 * boolean value like so:
 * 
 * $flagClassInstance->flagName = true; // sets flagName to true ('on')
 * $flagClassInstance->flagName = false; // sets flagName to false ('off')
 * 
 * $flagClassInstance->setFlag('flagName',true); // sets flagName to true ('on')
 * $flagClassInstance->setFlag('flagName',false); // sets flagName to false ('off')
**/
foreach($statusList as $i=>$status) {
    if(is_array($_POST) && array_key_exists('sub'.$status,$_POST)) {
        /**
         * All that is required to toggle the flag is to call:
         * $flagClassInstance->flagName();
        **/
        $state->$status();
    }
}

/**
 * Again, because the example spans multiple page views, store the updated flag data in
 * the session.
**/
$_SESSION['flags'] = $state->getData();


/**
 * And now, we start building the interface.
 * Start with echoing the current state (built-in __toString method to automatically
 * format the class conversion to string for display. Will show the state of each flag
 * as '1' or '0', in order of it's bit).
**/
echo 'Flag value:<br />'.$state.'<br /><br /><br />';

/**
 * Quick form to allow the user to set the number of flags
**/
echo "
<form name='flagnum' action='index.php' method='post'>
Number of flags: <input type='text' name='numberofflags' id='numberofflags' value='{$numberOfFlags}' /><br />
<input type='submit' name='flagnumsub' id='flagnumsub' value='Change' />
</form>
";

/**
 * Some quick formatting variables.
 * $perLine = number of flags to show per table row
 * $currentPer = used within the loop.
 * Neither are of significant value.
**/
$perLine = 20;
$currentPer = 0;
echo '<table><tr>';
for($i=count($statusList)-1,$l=0;$i>=$l;$i--) {
    $status = $statusList[$i];
    
    // Form to show the toggle button...
    $stateForm = "
<form name='changeState{$status}' action='index.php' method='post' style='display: inline;'>
<input type='submit' name='sub{$status}' id='sub{$status}' value='toggle' />
</form>
    ";
    
    echo '<td style="text-align: center;">';
    echo $status.'<br />';
    echo ( $state->$status ? 'Yes' : 'No' ).'<br />'; // $flagClassInstance->FlagName will return the flag value.
    echo ( $state->isFlagSet($status) ? '1' : '0' ).'<br />'; // $flagClassInstance->isFlagSet('flagName') will also return the flag value.
    echo $stateForm; // The form generated above...
    echo '</td>';
    
    // Below is formatting code...
    $currentPer++;
    if($currentPer%$perLine == 0) {
        echo '</tr>'
            .'<tr><td colspan="'.$perLine.'"><hr /></td>'
            .'<tr>';
    }
}
echo '</tr></table>';

/**
 * Here, we show the viewer how the data is stored. It is in a seriealized array of integers.
 * 
 * We also show the overall length of the flag data.
 * 
 * Though not shown, the length of the data string is on average less than the length required
 * to store an array of boolean values. Ultimately, this is a great tool for large amounts of
 * boolean values, though the advantages may be lost below a certain amount of values.
**/
echo 'To Store:<br />';
$toStore = $state->getData();
echo $toStore.'<br />';
echo 'Length: '.strlen($toStore);
?>
Return current item: Bitwise Flags