MultiInt snippertje
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)
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:
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
Er zijn 5 reacties op 'Multiint snippertje'
Om te reageren heb je een account nodig en je moet ingelogd zijn.
PHP hulp
0 seconden vanaf nu