阿米啦啦 发表于 2010-11-2 00:42:37

[讨论]话说AU3的数组.很不好用..

可能是AU3数组过分严紧.数组的索引只能为数字.还要先定义长度..

先说定义长度.当然是可以用关键字ReDim来重新改变数组长度.但还是很麻烦.
数组个人认为他是做为一个变量的组合.如果她不能变就没有太多义意

再说索引只能为数字.先看以下例子.Dim $Arr
        $Arr = "A"
        $Arr = "B"
MsgBox(0, 0, UBound($Arr))不管真实数组里有几个..UBound()都返回先定义的长度Dim $Arr
        $Arr = "A"
        $Arr = "B"如果例子上$Arr索引超过或等于定义的长度就会出错..
这个还说明数组索引只能在定义的长度范围内..

下面我们来分析一个很长见的程序..
一个班级学生分组
表A存分组.如A组B组, 表的结构为 组的ID=Gid 还有组的名称 GroupName
表B存学生名字等信息 表的结构为 ID , 学生姓名Name 组的ID=Gid
由于表A在添加和删除过程中不可能在保持期ID 为 1.2.3.4.....有序下去
如果要像PHP一样操作列出学生信息是不可能_SQLite_Query(-1, "SELECT Gid, GroupName FROM Group", $hQuery)
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
        $GroupArr[$aRow] = $aRow
WEnd
Dim $AllInfo = ""
_SQLite_Query(-1, "SELECT id, Name, Gid FROM Info", $hQuery)
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
        $AllInfo &= $aRow &"|"& $aRow &"|"& $GroupArr[$aRow] & @CRLF
WEnd
MsgBox(0, 0, $AllInfo)现在的数组模式要么就要以学生表B中的Gid一个一个的去查询表A的组名.老是查询数据库那是不好的.
要么就要用两个数组.一个存Gid.一个存组名称.通过_ArraySearch得到Gid索引举出组名称
所以在写程序过程中很麻烦..而PHP的数组索引还可以是字符串..

真希望AU3数组能改变一下

zps26 发表于 2010-11-2 10:12:07

用一个SQL语句不行吗?
表A:
组号   组名
Gid   GroupName
表B:
学号   姓名       组号
Sid   Name      Sgid

SELECT Sid, Name, Gid,GroupName
FROM B
LEFT JOIN A ON Sgid =GID
WHERE Name="张三"

阿米啦啦 发表于 2010-11-2 11:11:54

用一个SQL语句不行吗?
表A:
组号   组名
Gid   GroupName
表B:
学号   姓名       组号
Sid   ...
zps26 发表于 2010-11-2 10:12 http://www.autoitx.com/images/common/back.gif

这个是行..也有更多的方法..我只是弄个小例子..只是想说.如果数组支持无序和字符索引.我们在写程序时会方便很多..
例如在用这个学生信息程序来说..
我们要新建一个学生信息
那就会用到 GUICtrlCreateCombo() 来列出所有组.供录入员选择..
由于GUICtrlCreateCombo()的索引也是有序的..我们是无法通获取选择的GUICtrlCreateCombo()索引来得到组的ID
只有通过查询WHERE GroupName='& $Combo &' 或在举出GUICtrlCreateCombo()列表时多弄个数组做为保存Gid的

在PHP中我们可以用array_flip()函数交换数组中的键和值..在以$ArrGroup[$_POST['Combo']]得到Gid

3mile 发表于 2010-11-5 09:39:16

确实如此。
AU3中只存在有序数组,说实话基本的应用已经足够了。但好像没有提供散序数组。
我在官网找到过一个联合数组,不知道楼主有没有研究过。
地址如下:http://www.autoitscript.com/forum/index.php?showtopic=59174

只为关注 发表于 2011-1-27 09:56:47

原来是这样的啊,我说我的程序为啥出错呢。我总想先声明一个空数组,就是先不指定数组长度,用select语句动态的往数组里添加数据。结果出错,原来AutoIt必须先声明数组的长度啊,这确实麻烦了点

只为关注 发表于 2011-1-27 10:10:15

楼主可以这样做,先声明一个长度为1的数组,然后再程序中使用_ArryAdd动态添加元素,最后,再用_ArryDelete($array,0)删除第一个空元素。我也是刚刚被逼想出来的。

haodd 发表于 2011-2-13 11:04:28

回复 6# 只为关注


    太可爱了你{:face (411):}

Flykite 发表于 2014-12-1 13:57:18

回复 6# 只为关注


    俺一向也是这么干的 ^_^

kk_lee69 发表于 2014-12-1 14:41:00

回复 5# 只为关注

不用吧 如果是 SQL 語法的 陣列不用宣告 直接用


   
$A=$conn.Execute ("SELECT * FROM 表A").GetRows

$A 就會變成一個二維數組

kk_lee69 发表于 2014-12-1 14:41:23

回复 1# 阿米啦啦

不用吧 如果是 SQL 語法的 陣列不用宣告 直接用


   
$A=$conn.Execute ("SELECT * FROM 表A").GetRows

$A 就會變成一個二維數組

gto250 发表于 2014-12-2 22:07:47

Map functions Reference
Below is a complete list of the functions available in AutoIt. Click on a function name for a detailed description.



Function Description
MapAppend Add an element to a Map variable.

MapExists Determine whether a key exists within a Map.

MapKeys Returns an array holding the keys within a Map.

MapRemove Remove a key and its associated value from a Map.

用这个吧

cashiba 发表于 2016-12-23 23:39:58

这个主题好像没讨论完阿.......
两年过去了,有什么新变化吗
{:face (125):}

dingcool 发表于 2017-4-4 23:00:33

嗯 数组指针呢谁来解释解释
页: [1]
查看完整版本: [讨论]话说AU3的数组.很不好用..