找回密码
 加入
搜索
查看: 17304|回复: 12

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

  [复制链接]
发表于 2010-11-2 00:42:37 | 显示全部楼层 |阅读模式
可能是AU3数组过分严紧.数组的索引只能为数字.还要先定义长度..

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

再说索引只能为数字.先看以下例子.
Dim $Arr[3]
        $Arr[0] = "A"
        $Arr[2] = "B"
MsgBox(0, 0, UBound($Arr))
不管真实数组里有几个..UBound()都返回先定义的长度
Dim $Arr[3]
        $Arr[0] = "A"
        $Arr[3] = "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[0]] = $aRow[1]
WEnd
Dim $AllInfo = ""
_SQLite_Query(-1, "SELECT id, Name, Gid FROM Info", $hQuery)
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
        $AllInfo &= $aRow[0] &"|"& $aRow[1] &"|"& $GroupArr[$aRow[2]] & @CRLF
WEnd
MsgBox(0, 0, $AllInfo)
现在的数组模式要么就要以学生表B中的Gid一个一个的去查询表A的组名.老是查询数据库那是不好的.
要么就要用两个数组.一个存Gid.一个存组名称.通过_ArraySearch得到Gid索引举出组名称
所以在写程序过程中很麻烦..而PHP的数组索引还可以是字符串..

真希望AU3数组能改变一下
发表于 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


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

在PHP中我们可以用array_flip()函数交换数组中的键和值..在以$ArrGroup[$_POST['Combo']]得到Gid
发表于 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)删除第一个空元素。我也是刚刚被逼想出来的。
发表于 2011-2-13 11:04:28 | 显示全部楼层
回复 6# 只为关注


    太可爱了你
发表于 2014-12-1 13:57:18 | 显示全部楼层
回复 6# 只为关注


    俺一向也是这么干的 ^_^
发表于 2014-12-1 14:41:00 | 显示全部楼层
回复 5# 只为关注

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


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

$A 就會變成一個二維數組
发表于 2014-12-1 14:41:23 | 显示全部楼层
回复 1# 阿米啦啦

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


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

$A 就會變成一個二維數組
发表于 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.

用这个吧
发表于 2016-12-23 23:39:58 | 显示全部楼层
这个主题好像没讨论完阿.......
两年过去了,有什么新变化吗
发表于 2017-4-4 23:00:33 | 显示全部楼层
嗯 数组指针呢谁来解释解释
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 04:08 , Processed in 0.106680 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表