( GET / SET Functions )
HB_HGET() : Returns a hash value
Syntax : HB_HGET( <hsTable>, <Key> ) -> <Value>
HB_HPOS() : Locates the index of a key within a hash table
Syntax : HB_HPOS( <hsTable>, <Key> ) -> nPosition
HB_HVALUEAT() : Gets/sets a hash value at a given position
Syntax : HB_HVALUEAT( <hsTable>, <nPosition>, [<NewValue>] ) -> <Value>
HB_HVALUES() : Returns an array of the values of a hash table
Syntax : HB_HVALUES( <hsTable> ) -> <aValues>
HB_HKEYAT() : Gets a hash table key at a given position
Syntax : HB_HKEYAT( <hsTable>, <nPosition> ) -> <Key>
HB_HKEYS() : Returns an array of the keys of a hash table
Syntax : HB_HKEYS( <hsTable> ) -> <aKeys>
HB_HPAIRAT() : Returns a two-dimensional array of a hash table entry key/value pair
Syntax : HB_HPAIRAT( <hsTable>, <nPosition> ) -> <aKeyValue>
HB_HSCAN() : Scans a hash table for a value
Syntax : HB_HSCAN( <hsTable>, <Value>, [<nStart>], [<nCount>, [<lExact>] ) -> nPosition
HB_HSET() : Sets a hash value
Syntax : HB_HSET( <hsTable>, <Key>, <Value> ) -> <hsTable>
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
/*
Hash Details - 2
( GET / SET Funtions )
*/
#define xTrim( x ) IF( HB_ISNUMERIC( x ), LTRIM( STR( x ) ), ALLTRIM( x ) )
PROCEDURE Main()
SetMode( 60, 120 )
SET COLO TO "W/B"
cLMarj := SPACE( 3 )
CLS
hFruits := { "apple" => "green",;
"chery" => "pink",;
"apricot" => "yellow",;
"orange" => "orange" }
ListHash( hFruits, "Fruits" )
* HB_HGET( <hsTable>, <Key> ) -> <Value>
? "Value found by literal of 'apple' : ",;
hFruits[ "apple" ] // green
? "Value found by function of 'apple' : ",;
HB_HGET( hFruits, "apple" ) // green
?
* HB_HSET( <hsTable>, <Key>, <Value> ) -> <hsTable>
hFruits[ "apple" ] := "red"
? "New (assigned literally) Value of 'apple' : ",;
hFruits[ "apple" ] // red
HB_HSET( hFruits, "apple", "yellow" )
? "Newer (assigned by function) Value of 'apple' : ",;
hFruits[ "apple" ] // yellow
?
* HB_HPOS( <hsTable>, <Key> ) -> nPosition
? "Position of 'apple' : ", ;
xTrim( HB_HPOS( hFruits, "apple" ) ) // 1
* HB_HVALUEAT( <hsTable>, <nPosition>, [<NewValue>] ) -> <Value>
? "Position of 'melon' : ", ;
xTrim( HB_HPOS( hFruits, "melon" ) ) // 0
nPos := HB_HPOS( hFruits, "apricot" )
? "Position of 'apricot' : ",;
xTrim( HB_HPOS( hFruits, "apricot" ) ) // 4
?
? "Value of ", xTrim( nPos ) + ".th position :", ;
HB_HVALUEAT( hFruits, nPos ) // yellow
?
HB_HVALUEAT( hFruits, nPos, "fushia" )
? "Changed value in this position :",;
HB_HVALUEAT( hFruits, nPos ) // fushia
?
* HB_HKEYAT( <hsTable>, <nPosition> ) -> <Key>
? "Key in this position :" ,;
HB_HKEYAT( hFruits, nPos ) // apricot
?
* HB_HKEYS( <hsTable> ) -> <aKeys>
aKeys := HB_HKEYS( hFruits )
? "All keys in 'hFruits' : "
AEVAL( aKeys, { | cKey | QQOUT( cKey, '' ) } )
// apple chery orange apricot
?
* HB_HVALUES( <hsTable> ) -> <aValues>
aValues := HB_HVALUES( hFruits )
? "All values in 'hFruits' : "
AEVAL( aValues, { | cValue | QQOUT( cValue, '' ) } )
// green pink orange yellow
?
* HB_HPAIRAT( <hsTable>, <nPosition> ) -> <aKeyValue>
? "All pairs in 'hFruits' : "
Note : Compare this loop with below ListHash()
FOR nPos := 1 TO LEN( hFruits )
aKey_Value := HB_HPAIRAT( hFruits, nPos )
? xTrim( nPos ), aKey_Value[ 1 ], "=>", aKey_Value[ 2 ]
NEXT
?
* HB_HSCAN( <hsTable>, <Value>, [<nStart>], [<nCount>, [<lExact>] )
* -> nPosition
? "Position found by scanning value 'pink' : ",;
xTrim( HB_HSCAN( hFruits, "pink" ) ) // 2
?
@ MAXROW(), 0
WAIT "EOF HashDetails-2.prg"
RETURN // HashDetails-2.Main()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
PROCEDURE ListHash( hHash, cComment )
LOCAL x1Pair
cComment := IF( HB_ISNIL( cComment ), '', cComment )
? cComment, ''
* ?? "-- Type :", VALTYPE( hHash ),''
* ?? "size:", NTrim ( LEN( hHash ) )
?
FOR EACH x1Pair IN hHash
nIndex := x1Pair:__ENUMINDEX()
x1Key := x1Pair:__ENUMKEY()
x1Value := x1Pair:__ENUMVALUE()
? cLMarj, xTrim( nIndex )
* ?? '', VALTYPE( x1Pair )
?? '', xTrim( x1Key ), "=>"
* ?? '', VALTYPE( x1Key )
* ?? VALTYPE( x1Value )
IF HB_ISARRAY( x1Value )
AEVAL( x1Value, { | x1 | QQOUT( '', x1 ) } )
ELSE
?? '', xTrim( x1Value )
ENDIF
NEXT
? REPL( "~", 32 )
RETURN // ListHash()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
