Jump to content
Sign in to follow this  
Enigma

_ArrayShift and _ArrayUnshift

Recommended Posts

Enigma

I did a search and no one has done this before (according to search that is). Thought I'd post.

#include <Array.au3>

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BEGIN DOC
;
;-Calling Sequence:
;
; _ArrayUnshift()
;
;-Description:
;
; Push a new entry onto the front of an array.
;
;-Inputs:
;
; $a_Array = The array to modify.
; $a_Value = The value to push onto the array.
;
;-Outputs:
;
; $a_Array is modified.
;
;-Revisions:
;
; Name Company Date
; ---------------------------------------------------------------------------
; Mark Manning Simulacron I Mon 07/30/2012 1:38:04.67
; Original Program.
;
;
;END DOC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
func _ArrayUnshift( ByRef $a_Array, $a_Value )
local $ret = ubound( $a_Array );

if( $ret > 0 )then
_ArrayReverse( $a_Array );
_ArrayAdd( $a_Array, $a_Value );
_ArrayReverse( $a_Array );
return true;
else
return false;
endif
endfunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;BEGIN DOC
;
;-Calling Sequence:
;
; _ArrayShift()
;
;-Description:
;
; Pop the first entry off of an array.
;
;-Inputs:
;
; $a_Array = The array that is modified.
; $a_Value = The variable to hold the popped off value.
;
;-Outputs:
;
; $a_Array is modified by this function.
; $a_Value is modified to the popped off value.
;
;-Revisions:
;
; Name Company Date
; ---------------------------------------------------------------------------
; Mark Manning Simulacron I Mon 07/30/2012 1:38:28.57
; Original Program.
;
;
;END DOC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
func _ArrayShift( ByRef $a_Array, ByRef $a_Value )
local $ret = ubound( $a_Array );

if( $ret > 0 )then
_ArrayReverse( $a_Array );
$a_Value = _ArrayPop( $a_Array );
_ArrayReverse( $a_Array );
return true;
else
return false;
endif
endfunc
;
; tests
;
dim $i, $a_Value;
dim $ary[10];

consolewrite( "Original Array" & @crlf );
for $i=0 to 9
$ary[$i] = $i;
consolewrite( "Ary[" & $i & "] = " & $i & @crlf );
next

_ArrayUnshift( $ary, 11 );
consolewrite( "------------------------------------------------------------------" &@crlf );
consolewrite( @crlf & "_ArrayUnshift test" & @crlf );
consolewrite( "There are " & ubound($ary) & " entries in the array." & @crlf );
for $i=0 to ubound($ary)-1
consolewrite( "Ary[" & $i & "] = " & $ary[$i] & @crlf );
next

     _ArrayShift( $ary, $a_Value );
consolewrite( "------------------------------------------------------------------" &@crlf );
consolewrite( @crlf & "_ArrayShift test" & @crlf );
consolewrite( "There are " & ubound($ary) & " entries in the array." & @crlf );
for $i=0 to ubound($ary)-1
consolewrite( "Ary[" & $i & "] = " & $ary[$i] & @crlf );
next

Nothing fancy. Just a simple unshift and shift function. If the person who maintains the Array.au3 UDF wants to include these - be my guest. :-)

The best way to run the test is through the AutoIt Debugger since it captures the console output and displays it automatically. You should see:

Original Array

Ary[0] = 0

Ary[1] = 1

Ary[2] = 2

Ary[3] = 3

Ary[4] = 4

Ary[5] = 5

Ary[6] = 6

Ary[7] = 7

Ary[8] = 8

Ary[9] = 9

------------------------------------------------------------------

_ArrayUnshift test

There are 11 entries in the array.

Ary[0] = 11

Ary[1] = 0

Ary[2] = 1

Ary[3] = 2

Ary[4] = 3

Ary[5] = 4

Ary[6] = 5

Ary[7] = 6

Ary[8] = 7

Ary[9] = 8

Ary[10] = 9

------------------------------------------------------------------

_ArrayShift test

There are 10 entries in the array.

Ary[0] = 0

Ary[1] = 1

Ary[2] = 2

Ary[3] = 3

Ary[4] = 4

Ary[5] = 5

Ary[6] = 6

Ary[7] = 7

Ary[8] = 8

Ary[9] = 9

I just checked the PHP website about array_shift and array_unshift and an interesting thing is - if _ArrayAdd() were modified a bit so it did one or more entries based upon whether or not the incoming information was an array or not (see the UBound() function) then this _ArrayUnshift() would work exactly like the PHP function.

Later!

Share this post


Link to post
Share on other sites
funkey

This is just something like _ArrayDelete() and _ArrayInsert(), or did I miss something?


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites
Enigma

Wow! Thought I was seeing double there when I saw your avatar! Still freaking me out a bit. My mind wants to put those two eyes and mouths together. :-P

Anyway - yes and no! :-) _ArrayInsert() does do what _ArrayUnshift() does except _ArrayUnshift is more restricted. _ArrayDelete() does do what _ArrayShift() does - but - _ArrayDelete just deletes the entry. _ArrayShift() returns the entry. But _ArrayShift() could probably be modified to get the value and return it before using _ArrayDelete(). Or if the person who works on the Array.au3 code wanted to modify the _ArrayDelete() function to return the value of whatever it is deleting - then these two functions would not be really needed. I'm just used to using the PHP function calls and didn't see the other ones. For some reason I took _ArrayDelete() to mean to delete the entire array and _ArrayInsert() to insert an entirely new array. What I get for not actually reading the function information. My bad. :-)

Edited by Enigma

Share this post


Link to post
Share on other sites
czardas

I don't get why you introduce the value 11 with _ArrayUnshift. I would expect -1.which comes before zero. :blink:

In AutoIt it is quite common to exclude the first element from the count, so Ary[0] would be 10. The function Ubound gives the total number of elements which in this case is 11.

Although it's not really needed, I think it's a good idea anyway.

Edited by czardas

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.