MultiInt snippertje

Door Toby hinloopen, 13 jaar geleden, 2.599x bekeken

Met dit snippertje heb je de mogelijkheid om meerdere getallen in 1 getal-variable op te slaan. Zo kan je bijvoorbeeld 32 booleans in 1 getal opslaan.

Wanneer je meerdere getallen wilt opslaan als 1 getal:
Als 1e argument moet je de getallen meegeven in een array. Als 2e argument moet je een array meegeven die dient als "layout".

Wanneer je dat getal weer wilt "uitpakken" tot een array met getallen:
Als 1e argument moet je het getal meegeven. Als 2e argument moet je een array meegeven die dient als "layout".

Zorg ervoor dat de layout bij zowel inpakken als uitpakken hetzelfde is, anders kunnen er vage dingen gebeuren. Houdt er ook rekening mee dat je niet meer dan 32 bits aan data in 1 getal kan opslaan. (jammer nou)

De layout array (2e argument) kan zowel een numerieke als een assoc array zijn, zolang de "keys" maar overeen komen met het 1e argument bij inpakken.

Gebruik: (voorbeeld)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$int
=   multiint( array(3,1), array(2,1)); //$int = 7; (binary 111)
$multi = multiint( $int      , array(2,1)); //$multi = array(2,1);
    
$int =   multiint( array(28,3), array(5,3));     //$int = 115; (binary 11100011)
$multi = multiint( $int       , array(2,2,2,2)); //$multi = array(3,2,0,3);
    
$user_info = array(
    'age' => 44,
    'registered' => 1,
    'status' => 7,
);

$user_info_layout = array(
    'age' => 7,  //range: 0-127 ( 2^7-1 = 127)
    'registered' => 1,  //range: 0 or 1 ( 2^1-1 = 1)
    'status' => 3,  //range: 0-7 ( 2^3-1 = 8)
);
$dataInt =    multiint( $user_info , $user_info_layout); //$dataInt = 719 (binair: 1011001111)
$user_info2 = multiint( $dataInt   , $user_info_layout); //$user_info2 = array('age' => 44,'registered' => 1,'status' => 7);
    echo $user_info2['age'];//will output "44".
?>


Mijn gebrekkig-engelse omschrijving staat in de code.

...

...

Ja betere uitleg kan ik niet geven :P
test em eens voor de lol :P

...

Voordat de vraag komt: het nut hiervan:
-sla 8 booleans op in 1 byte. (de int als output in de functie ord(); gooien en je hebt 1 teken)
-sla 32 booleans op in 1 INT.
-sla 2 booleans en 1 getal die nooit hoger wordt dan 63 op in 1 byte.

"WTF MAN?! waarom zou je dat willen???"
Ik heb dit systeem voornamelijk gemaakt om zoveel mogelijk data in een BASE64 encoding te proppen. Zo kan ik 6 booleans kwijt in 1 BASE64 teken. Handig om mee te zenden in een URL of op te slaan op iets waar alleen maar tekst toegestaan is. Uiteraard moet je het getal wel eerst omzetten naar BASE64 of een bytes-stream.

Zie je het al voor je? 6 booleans (waar/niet waar) mee kunnen sturen in 1 teken van een URL? mooi hè... :P

Enkele nootjes:
-De functie houdt echt niet van negatieve getallen. Negatieve getallen worden afgerond naar 0.
-De functie rond automatisch getallen af naar beneden wanneer deze te groot zijn voor zn toegewezen ruimte.
-Het bereik van een variable is te berekenen: van 0 tot 2^TOEGEWEZEN_BITS - 1

Voorbeeldje van het opslaan van 4 booleans in 1 getal:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$data
= multiint(array(
'a' => true,//booleans worden automatisch omgezet in een 1 of een 0.
'b' => false,
'c' => false,
'd' => true
),
array(1,1,1,1)//wijs de vier "getallen" 1 bit toe.
);

echo $data;//echo 15

print_r(multiint($data,array(1,1,1,1))); // array(1,0,0,1)

print_r(multiint($data,array('e'=>1,'f'=>1,'jantje'=>1,2=>1)));/* array(
'e' => 1,
'f' => 0,
'jantje' => 0,
2 => 1)*/


?>


Hint:
http://www.phphulp.nl/php/scripts/11/1569/

Die werkt er wel handig mee: 6 booleans opslaan in 1 base64 teken die je veilig kan opslaan in text of url's.

Gesponsorde koppelingen

PHP script bestanden

  1. multiint-snippertje

 

Er zijn 5 reacties op 'Multiint snippertje'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Onbekend Onbekend
Onbekend Onbekend
13 jaar geleden
 
0 +1 -0 -1
Wat is het nut hier van? Gebruik gewoon een array
Toby hinloopen
toby hinloopen
13 jaar geleden
 
0 +1 -0 -1
@Tommy
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?
$data
= multiint(
array(
'heeft_hokje_aangevinkt' = 1,
'heeft_hokje2_aangevinkt' = 0,
'selected_radio_button' = 2
),array(
'heeft_hokje_aangevinkt' = 1,//1 of 0. Kost maar 1 bit.
'heeft_hokje2_aangevinkt' = 1,//1 of 0. Kost maar 1 bit.
'selected_radio_button' = 2//0, 1, 2 of 3. Kost 2 bits.
)
);


//$data is altijd een getal tussen 0 en 63, omdat deze maar 6 bits kost.
//Vervolgens kan je nu dit getal omzetten naar 1 teken met base64::int()
// http://www.phphulp.nl/php/scripts/11/1569/


$data = base64::int_encode($data);

$url = "www.url.com?a=" . $data;
//$url = www.url.com?a=f
//merk op dat die 2 booleans en een getal van 0 tot 3 gepropt worden in 1 teken en die altijd in een url meegegeven kan worden zonder dat ie in %00 veranderd.

//en dan kan je later weer gebruiken:

$data = base64::int_decode($_GET[a]);
$data = multiint($data,array(
'heeft_hokje_aangevinkt' = 1,//1 of 0. Kost maar 1 bit.
'heeft_hokje2_aangevinkt' = 1,//1 of 0. Kost maar 1 bit.
'selected_radio_button' = 2//0, 1, 2 of 3. Kost 2 bits.
));
print_r($data);
/*
array(
'heeft_hokje_aangevinkt' = 1,
'heeft_hokje2_aangevinkt' = 0,
'selected_radio_button' = 2
)
*/

?>
Storeman storeman
storeman storeman
13 jaar geleden
 
0 +1 -0 -1
Leuk gevonden. Vooral handig als je rechten oid wilt opslaan in een DB. Echter maak je de weg wel moeilijker dan nodig. Je zou namelijk ook gewoon boolean operators kunnen gebruiken. Ik weet niet precies hoe het werkt, maar het lijkt op het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
if( $eengetal & 2 ) //2 is van toepassing
if( $eengetal & 3 ) // 1 en 2 zijn van toepassing
if ($eengetal & 4 ) // 4 is van toepassing
if ($eengetal & 7 ) // 1, 2 en 4 zijn van toepassing

etc.
Toby hinloopen
toby hinloopen
13 jaar geleden
 
0 +1 -0 -1
@storeman:
klopt. Maar in dit geval kan je niet alleen booleans opslaan. Je kan ook kleine getallen (radio buttons met 4 opties o.i.d.) opslaan.
Bovendien heb je het hier meteen in een (assoc)array vanuit de functie, zodat je zelf niet hoeft te kloten met &2 &3 etc.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Klaasjan Boven
Klaasjan Boven
13 jaar geleden
 
0 +1 -0 -1
@Storeman volgens mij heet dat Bitwise

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. multiint-snippertje

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.