我有两个分别名为atest
和NEWARRAY
的数组,我试图将两个数组的元素与简单的if()
进行比较,而这仅是比较数组的第一个元素,如何一次比较所有数组值,这是我的代码
IF (Alltrim(atest)== Alltrim(NEWARRAY))
Messagebox('Success',64,'Status')
Else
Messagebox('MisMatch',16,'Status')
ENDIF
答案 0 :(得分:0)
Fox有一些对整个数组起作用的函数-例如acopy
,ascan
和asort
-但没有内置函数可以比较整个数组。因此,您必须对每个元素进行比较元素,例如使用for
循环。
是的,如果您使用数组名称作为表达式(包括按值传递),则会获取第一个数组元素的值。但是,有一个例外:当您在需要数组参数的位置将数组传递给内置函数时,编译器将在幕后自动发出引用令牌,以安排按引用而不是传递按值传递。
因此,如果您要向其传递数组f()
的用户定义函数a
,则需要这样调用它:f(@m.a)
,但是可以调用build -in函数采用如下数组:alen(a)
(因为在这种情况下也可以忽略m.
)。实际上,如果您编写了类似alen(@m.a)
或alen(@a)
的代码,Fox会抱怨,并且在这种情况下,更老的Foxen甚至可能崩溃。
相反,如果数组是赋值的目标,如a = 42
或store 42 to a
,则该值将分配给所有数组元素。这对于将数组初始化为0
,''
或.null.
之类的文件很方便。
因此,如果您有两个数组a
和b
,那么a = b
会将b
的第一个值分配给a
的所有元素,并且{ {1}}将仅比较相应的第一个单元格。
旁注:如果您必须比较具有相同或等效结构的表中的记录,则应记住查找if a == b
。它对对象有效,并分散记录Fox对数组不起作用的功能:它将整个销售进行比较。也就是说,它会将属性值与匹配的名称进行比较,并告诉您是否存在不匹配,并且它的执行速度比手工编写的代码要快得多。
理论上,您可以将一个数组收集到一个表/光标记录中,然后使用compobj()
生成一个散点记录,然后可以将该散点记录与以类似方式生成的名为scatter name Walther
的散点记录进行比较另一个数组的内容提供的流行方式:Herbert
会告诉您原始数组是否相等。但是,我很难想象会在生产代码中使用类似代码的情况...
答案 1 :(得分:0)
您可以创建一个简单的过程进行比较:
Procedure CompareArrays(ta1, ta2)
If Alen(ta1) != Alen(ta2)
Return .F.
EndIf
Local ix
For ix=1 to Alen(ta1)
If (Type('ta1[m.ix]') != Type('ta2[m.ix]') or ta1[m.ix] != ta2[m.ix])
Return .F.
endif
endfor
endproc
并通过引用传递您的数组。即:
isIdentical = CompareArrays(@laArr1, @laArr2)
如果数组成员可以容纳对象,则应使用compobj来比较数组元素。