Tem como saber, dado um array se ele tem 1 dimensão ou mais de 1 dimensão:
Código: Selecionar todos
ex. a:={"teste", "teste"}
a:={{"TESTE", "TESTE"}}
Moderador: Moderadores
Código: Selecionar todos
ex. a:={"teste", "teste"}
a:={{"TESTE", "TESTE"}}
Código: Selecionar todos
Function Main()
Local aTeste
aTeste:={Nil,Nil} // unidimensional
If ValType( ATail( aTeste ) ) != "A"
Hb_Alert( "aTeste é uma Matriz Unidimensional" )
Else
Hb_Alert( "aTeste é uma Matriz Bidimensional" )
EndIf
aTeste:={{Nil,Nil}} // bidimensional
If ValType( ATail( aTeste ) ) != "A"
Hb_Alert( "aTeste é uma Matriz Unidimensional" )
Else
Hb_Alert( "aTeste é uma Matriz Bidimensional" )
EndIf
Return Nil 
Código: Selecionar todos
a := { { "TESTE", "TESTE" }, "Teste"}Código: Selecionar todos
LOCAL aArray, a, lMulti := .F.
aArray := { { "TESTE", "TESTE" }, "Teste"}
For Each a in aArray
If Valtype( a ) == "A"
lMulti := .T.
Exit
ENdif
Next
Hb_Alert( { "O tipo do array é", If( lMulti, "Multidimensional", "Unidimensional" } )Claro que sim. Estamos falando em matriz unidimensional e bimensional, seu exemplo apresenta uma matriz TRIdimensional (se é que existe). Pode mostrar um exemplo de como acessar esse terceiro elemento?alxsts escreveu:@Jairo: tem certeza de que a lógica do teu exemplo funciona?
Não. Tenho situações que numa mesma matriz ela guarda outras matrizes. Quando é o caso, basta usar a lógica dos eixos "X" e "Y" da matriz. Algo como aTestes[1,1,2,3]. Uso isso. Oportunamente posso até montar um exemplo. Sem problemas.fladimir escreveu:E no caso de mais de 2 dimensões? Da pra fazer um FOR NEXT será?

O array que mostrei é um array aninhado (nested). Em xBase, não há limite para a quantidade de dimensões de um array, a não ser a memória disponível.Jairo Maia escreveu: seu exemplo apresenta uma matriz TRIdimensional (se é que existe). Pode mostrar um exemplo de como acessar esse terceiro elemento?
Código: Selecionar todos
Function Main()
LOCAL aArray := { { "TESTE", "TESTE" }, "Teste"}
SetMode( 25,80 )
Hb_Alert( { "aArray[ 1, 1 ] ; ", aArray[ 1, 1 ] } )
Hb_Alert( { "aArray[ 1, 2 ] ; ", aArray[ 1, 2 ] } )
Hb_Alert( { "aArray[ 2 ] ; ", aArray[ 2 ] } )
Jairo( aArray )
Alexandre( aArray )
RETURN NIL
//---------------------------------------------------------------
STATIC Function Jairo( aArray )
Local aTeste
aTeste:={Nil,Nil} // unidimensional
If ValType( ATail( aTeste ) ) != "A"
Hb_Alert( "aTeste é uma Matriz Unidimensional" )
Else
Hb_Alert( "aTeste é uma Matriz Bidimensional" )
EndIf
aTeste:={{Nil,Nil}} // bidimensional
If ValType( ATail( aTeste ) ) != "A"
Hb_Alert( "aTeste é uma Matriz Unidimensional" )
Else
Hb_Alert( "aTeste é uma Matriz Bidimensional" )
EndIf
aTeste:= aArray // Nested Array ou array aninhado
If ValType( ATail( aTeste ) ) != "A"
Hb_Alert( "aTeste é uma Matriz Unidimensional" )
Else
Hb_Alert( "aTeste é uma Matriz Bidimensional" )
EndIf
Return Nil
//--------------------------------------------------
STATIC FUNCTION Alexandre( aArray )
LOCAL a, lMulti := .F.
For Each a in aArray
If Valtype( a ) == "A"
lMulti := .T.
Exit
ENdif
Next
Hb_Alert( { "O tipo do array é", If( lMulti, "Multidimensional", "Unidimensional" ) } )
RETURN NIL
//--------------------------------------------------Nos tempos do Clipper, quando não havia Hash, usava-se muito este tipo de array. Imagine varrer uma tabela de títulos a receber, ordenada por cliente, buscando os títulos em atraso. Para cada título, posso fazer:Jairo Maia escreveu:Nota: Isso porque não vi lógica programática para uso desse tipo de matriz.
Código: Selecionar todos
AAdd( aTitulos, { nrTitulo, dtVencto, vlTitulo }, cdCli } )

Veja a linha Hb_Alert( { "aArray[ 2 ] ; ", aArray[ 2 ] } ). Ela exibe os dois elementos ( aArray[ 1, 1 ] e aArray[ 1, 2 ] ) do sub array (que é o elemento 1 de aArray) e depois exibe o segundo elemento de aArray (aArray[ 2 ]):Jairo Maia escreveu:Mas onde está o exemplo para acessar o elemento 3?
Você postou um exemplo que acessa o elemento 1 e 2. Altere o elemento 3 para por exemplo "algoz", e quero ver como acessá-lo.
Código: Selecionar todos
Function Main()
LOCAL aArray := { { "TESTE", "TESTE" }, "Algoz"}
SetMode( 25,80 )
Hb_Alert( { "aArray[ 1, 1 ] ; ", aArray[ 1, 1 ] } )
Hb_Alert( { "aArray[ 1, 2 ] ; ", aArray[ 1, 2 ] } )
Hb_Alert( { "aArray[ 2 ] ; ", aArray[ 2 ] } )
RETURN NIL
//---------------------------------------------------------------
Código: Selecionar todos
LOCAL aArray := { { "TESTE", "TESTE" }, "Algoz"}
? Len( aArray ) //---> 2
? Len( aArray[ 1 ] ) //---> 2
? Len( aArray[ 2 ] ) //---> 5
? ValType( aArray ) //---> "A"
? ValType( aArray[ 1 ] ) //---> "A"
? ValType( aArray[ 2 ] ) //---> "C"
Código: Selecionar todos
AAdd( aTitulos, { nrTitulo, dtVencto, vlTitulo }, cdCli } )
{ nrTitulo, dtVencto, vlTitulo }, cdCli
20 22/10/2016 500,00 2058
30 31/12/2016 1.500,00 2058
421 15/01/2017 560,00 2058
524 31/01/2017 230,00 4356
602 30/11/2016 750,00 8055
650 15/12/2016 990,00 8055
Código: Selecionar todos
aFiles := Directory( "*.*" )
FOR nCont = 1 TO Len( aFiles )
? aFiles[ nCont, F_NAME ]
NEXT

Código: Selecionar todos
#define X_CLIENTE 1
#define X_DOCLIST 2
#define X_NUMERO 1
#define X_DATA 2
#define X_VALOR 3
aArray := { { cliente, { { numero, data, valor }, { numero, data, valor } } }, { cliente, { { numero, data, valor }, { numero, data, valor } } } }
FOR EACH oCliente IN aArray
FOR EACH oDocto IN oCliente[ X_DOCLIST ]
? oCliente[ X_CLIENTE ], oDocto[ X_NUMERO ], oDocto[ X_DATA ], oDocto[ X_VALOR ]
NEXT
NEXT