PHP Arrays

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

  • Un array é un tipo estrutura de datos. Dita estrutura se caracteriza por ter un número de elementos variable no que cada valor a gardar está relacionado cun índice que 'apunta' á posición do elemento dentro do array.
  • Podemos identificar un array como unha cómoda con caixóns no que cada caixón se pode identificar có índice do array e dentro de cada caixón teremos gardada a información.
Cabe sinalar que dentro dun caixón poderíamos ter outra cómoda con máis caixóns a súa vez.


Un array pódese crear có construtor da linguaxe array() desta forma:

1 <?php  
2  array(
3     clave  => valor,
4     clave2 => valor2,
5     clave3 => valor3,
6     ...
7     )
8 ?>

Vexamos un exemplo de parte dos ingredientes dunha receita:

 1 <?php  
 2 $ingredientes = array(
 3     0 => "améndoa",
 4     1 => "fresas",
 5 );
 6 
 7 // a partires de PHP 5.4
 8 $ingredientes = [  // Leva corchetes e sen a palabra array
 9     0 => "améndoa",
10     1 => "fresas",
11 ];
12 ?>
  • Como vemos a estrutura que mellor se adapta a gardar información sobre os ingredientes dunha receita é un Array. Non ten sentido ter unha variable por cada un dos ingredientes da receita.
  • Vexamos un exemplo no que as claves sexan cadeas de caracteres:
1 <?php  
2           $persoa = ['nome' => 'Juan Francisco',
3                      'direccion' => 'C/ Rúa de alá nº5',
4                      'telefono' =>'981121212'];
5 
6 ?>

Accedendos aos valores gardados no array (para programadores)

  • Existe unha función que devolve toda a estructura do array en forma de volcado coa que podemos ver o número de elementos, claves e valores.
Nota:Pódese empregar para outros tipos de variables.
  • Vexamos un exemplo:
1 <?php
2 $array = array("un", "dous", "tres", "catro");
3 printf("<br>");
4 var_dump($array);
5 printf("<br>");
6 print_r($array);
7 ?>
O resultado:
1 array(4) { [0]=> string(2) "un" [1]=> string(4) "dous" [2]=> string(4) "tres" [3]=> string(5) "catro" }   // RESULTADO var_dump
2 Array ( [0] => un [1] => dous [2] => tres [3] => catro )                                                  // RESULTADO print_r


Accedendos aos valores gardados no array (1ª forma)

  • Unha das formas para acceder aos valores do array é:
  • $variable_array[clave]
ou
  • $variable_array{clave}
Pódense utilizar corchetes ou chaves indistintamente.
No exemplo anterior:
 1 <?php  
 2 $ingredientes = [  // Leva corchetes e sen a palabra array
 3     0 => "améndoa",
 4     1 => "fresas",
 5 ];
 6 
 7 printf("O primeiro ingrediente do array é: %s<br/>", $ingredientes[0]);
 8 printf("O segundo ingrediente do array é: %s<br/>", $ingredientes[1]);
 9 
10 ?>


  • No caso anterior no que o array tiña como clave unha cadea:
1 <?php  
2          $persoa = ['nome' => 'Juan Francisco',
3                      'direccion' => 'C/ Rúa de alá nº5',
4                      'telefono' =>'981121212'];
5           printf("Datos da persoa:<br/>Nome:%s<br/>Dirección:%s<br/>Teléfono:%s",$persoa['nome'],$persoa['direccion'],$persoa['telefono']);
6 ?>

Declaración dun array: valores claves

  • Como dixemos anteriormente o array ten unha clave coa que facemos referencia aos valores gardados no array.
  • Dita clave pode ser numérica ou cadea e os valores que podemos gardar poden ser de calquera tipo.
  • Se usamos como clave un tipo de dato diferente, PHP fará un 'cast' a o tipo de dato integer ou string (como indicamos antes).
Así:
  • Float: será convertido a un integer quitando a parte decimal.
  • String: se o string é un número válido (por exemplo "8") será convertido a integer.
  • Boolean: será convertido a integer (true = 1; false = 0)
  • null: será convertido a cadea valeira.
  • Se non poñemos clave dará o valor seguinte a última numérica instroducida.


  • Vexamos uns exemplos:
 1 <?php  
 2           $disco = [
 3             1 => '32454KAS12',
 4             'capacidad' => '500GB',
 5             '3500rpm',
 6             'marca' => 'seagate',
 7             3.5 => 'SATA'  
 8           ];
 9 
10           printf("<br>");
11           printf("O primeiro dato é o número de serie=> \$disco[1]:%s => A clave numérica é 1<br/>",$disco[1]);
12           printf("O segundo dato=> \$disco['capacidad']:%s<br/>",$disco['capacidad']);
13           printf("O terceiro dato (velocidade) non leva clave polo que dalle a seguine numérica=> \$disco[2]:%s => A clave numérica é 2<br/>",$disco[2]);
14           printf("O cuarto dato é a marca=> \$disco['marca']:%s<br/>",$disco['marca']);
15           printf("O quinto dato (tipo conector) a clave convírtese de float a integer=> \$disco[3]:%s A clave numérica é 3<br/>",$disco[3]);
16 
17 ?>
O resultado:
1 O primeiro dato é o número de serie=> $disco[1]:32454KAS12 => A clave numérica é 1
2 O segundo dato=> $disco['capacidad']:500GB
3 O terceiro dato (velocidade) non leva clave polo que dalle a seguine numérica=> $disco[2]:3500rpm => A clave numérica é 2
4 O cuarto dato é a marca=> $disco['marca']:seagate
5 O quinto dato (tipo conector) a clave convírtese de float a integer=> $disco[3]:SATA A clave numérica é 3
Como podemos comprobar no exemplo anterior é posible ter un array con claves mixtas (cadea e numérica)
  • Outro exemplo:
1 <?php
2 $array = array("un", "dous", "tres", "catro");
3 printf("%s-%s-%s-%s",$array[0],$array[1],$array[2],$array[3]);
4 ?>
Neste exemplo non asociamos ningunha clave e PHP irá, dende 0, incrementando a clave asociada a cada valor dentro do array.


Eliminando, modificando ou engadindo valores a un array

Eliminar un elemento do Array

  • Para eliminar un elemento do array temos que facer uso da función unset.
1 unset($array[clave]);
Nota: unset pódese utilizar para eliminar calquera variable que teñamos definida.
  • Vexamos un exemplo:
1     <?php
2         $ingredientes = ["améndoa","fresas","azucre","fariña"];
3         print_r($ingredientes);
4         unset($ingredientes[2]);
5         echo '<br />Despois de eliminar o número 2 (empeza en 0):';
6         print_r($ingredientes);
7         
8      ?>
Dará como resultado:
1 Array ( [0] => améndoa 
2         [1] => fresas 
3         [2] => azucre 
4         [3] => fariña )
5 Despois de eliminar o dato con clave 2:
6 Array ( [0] => améndoa 
7         [1] => fresas 
8         [3] => fariña )

Índices do Array

  • Hai que ter coidado cando eliminamos un elemento dun array, xa que os índices non se actualizan.
Así:
1 <?php
2 $a = array(1 => 'uno', 2 => 'dos', 3 => 'tres');
3 unset($a[2]);
4 /* producirá un array con estes índices
5    $a = array(1 => 'uno', 3 => 'tres');
6 */
7 ?>
Se queremos que os índices se actualicen teremos que facer uso da función array-values.
No exemplo anterior:
1 <?php
2 $a = array(1 => 'uno', 2 => 'dos', 3 => 'tres');
3 unset($a[2]);
4 $a = array_values($a);
5 /* producirá un array con estes índices
6    $a = array(1 => 'uno', 2 => 'tres');
7 */
8 ?>

Modificar un elemento do array

  • Teremos que saber cal é a súa clave asociada: $array[clave]=novo_valor
  • Vexamos un exemplo:
1     <?php
2         $ingredientes = ["améndoa","fresas","azucre","fariña"];
3         print_r($ingredientes);
4         $ingredientes[2]='mel';
5         echo '<br />Despois de modificar o dato con clave 2:<br />';
6         print_r($ingredientes);
7      ?>
Dará como resultado:
1 Array ( [0] => améndoa [1] => fresas [2] => azucre [3] => fariña )
2 
3 Despois de modificar o dato con clave 2:
4 Array ( [0] => améndoa [1] => fresas [2] => mel [3] => fariña )


Engadir novos elementos ao array

  • Para engadir un novo elemento só temos que facer uso dunha clave que non exista no array ou ben usar os corchetes baleiros para que asigne o seguinte valor numérico de clave.
  • Sería:
  • $array[nova_clave]=novo_valor;
  • $array[]=novo_valor;
A primeira forma permite facer uso de claves numéricas ou de cadea e a segunda forma sempre vai engadir unha clave numérica.
  • Vexamos un exemplo:
1     <?php
2         $ingredientes = ["améndoa","fresas","azucre","fariña"];
3         print_r($ingredientes);
4         $ingredientes[]='ovos';
5         echo '<br />Despois de engadir un novo ingrediente con clave 4:<br />';
6         print_r($ingredientes);
7      ?>
Dará como resultado:
1 Array ( [0] => améndoa [1] => fresas [2] => azucre [3] => fariña )
2 
3 Despois de engadir un novo ingrediente con clave 4:
4 Array ( [0] => améndoa [1] => fresas [2] => azucre [3] => fariña [4] => ovos )
  • Outro exemplo:
1     <?php
2          $persoa = ['nome' => 'Juan Francisco',
3                      'direccion' => 'C/ Rúa de alá nº5',
4                      'telefono' =>'981121212'];
5          print_r($persoa);
6          echo '<br />Despois de engadir un novo dato:<br />';
7          $persoa['idade']=52;
8          print_r($persoa);
9      ?>
Dará como resultado:
1 Array ( [nome] => Juan Francisco [direccion] => C/ Rúa de alá nº5 [telefono] => 981121212 )
2 
3 Despois de engadir un novo dato:
4 Array ( [nome] => Juan Francisco [direccion] => C/ Rúa de alá nº5 [telefono] => 981121212 [idade] => 52 )

Eliminando elementos do array

  • Con esta forma podemos eliminar elementos do array dentro do bucle.
Vexamos un exemplo:
 1 <?php
 2         $datos = ['casa','can','amigo','coche'];
 3         echo "Dentro dun bucle...<br />";
 4         while($valor=each($datos)){
 5             if ($valor['key']==1){
 6                 unset($valor['key']);
 7             }
 8             else {
 9                 printf("<br />Valor con \$valor['value']:%s",$valor['value']);
10                 printf("<br />Clave con \$valor['key']:%s",$valor['key']);
11             }
12         }
13         echo "<br />Acabou o bucle<br />";
14 ?>
Dará como resultado:
1 Dentro dun bucle...
2 
3 Valor con $valor['value']:casa
4 Clave con $valor['key']:0
5 Valor con $valor['value']:amigo
6 Clave con $valor['key']:2
7 Valor con $valor['value']:coche
8 Clave con $valor['key']:3
9 Acabou o bucle

Accedendo aos valores gardados no array (2ª forma)

  • Podemos facer uso da función count que devolve o número de elementos do array.
Vexamos un exemplo:
1 <?php
2         $datos = ['casa','can','amigo'];
3         for ($cont=0; $cont<count($datos); $cont++){
4             printf("Dato:%s<br />",$datos[$cont]);
5         }
6 ?>
Loxicamente esta forma de percorrer o array soamente funcionará cando os valores clave sexan de tipo numérico.
  • Nota: Hai que ter en conta que dita función devolve 0 se o array non está inicializado ou se o array está baleiro. Para distinguir os dous casos podemos facer uso da función isset vista anteriormente.
En caso de que non se poida contar (por exemplo se non é un array) devolve 1. Para saber se é un array lembrar que dispoñemos da función is_array.

Eliminando elementos do array

  • Non deberíamos eliminar un elemento do array mentres o estamos a percorrer desta forma se queremos continuar có resto de elementos.
  • Por exemplo:
 1 <?php
 2         $datos = ['casa','can','amigo','coche'];
 3         for ($cont=0; $cont<count($datos); $cont++){
 4             if ($cont==1){
 5                 unset($datos[$cont]);
 6             }  else {
 7                 printf("Dato:%s<br />",$datos[$cont]);
 8             }
 9         }
10 ?>
Neste exemplo estamos a eliminar o elemento do array coa clave 1 que se corresponde có dato 'can'.
Php matrices 1.jpg
Como se pode comprobar nunca amosa o dato 'coche' xa que ao eliminar un elemento a función count se decrementa.

Accedendo aos valores gardados no array (3ª forma)

  • Cando percorremos un array podemos facer uso dun 'punteiro' que vai pasando de posición dun ao seguinte.
  • A función each permite movernos dun elemento do array ao seguinte.
Dita función devolve noutro array o valor do primeiro elemento do array e a clave asociada a ese valor. Ao mesmo tempo pasa ao seguinte elemento do array.
Pódese repetir dita operación ata chegar ao final do array. Nese intro a 'función each' devolve false.
  • O array de información que devolve a función é:
  • [1] ou [value]: Devolve o valor do elemento do array.
  • [0] ou [key]: Devolve a key asociada ao valor do elemento do array.
  • Por exemplo:
 1 <?php
 2         $datos = ['casa','can','amigo','coche'];
 3         $valor=each($datos);    // Le e pasa ao seguinte
 4         printf("<br />Valor con \$valor[1]:%s",$valor[1]);
 5         printf("<br />Valor con \$valor['value']:%s",$valor['value']);
 6         printf("<br />Clave con \$valor[0]:%s",$valor[0]);
 7         printf("<br />Clave con \$valor['key']:%s",$valor['key']);
 8         
 9         echo "<br />Lendo outro novo dato do array...<br />";
10         
11         $valor=each($datos); // Le e paso ao seguinte
12         printf("<br />Valor con \$valor[1]:%s",$valor[1]);
13         printf("<br />Valor con \$valor['value']:%s",$valor['value']);
14         printf("<br />Clave con \$valor[0]:%s",$valor[0]);
15         printf("<br />Clave con \$valor['key']:%s",$valor['key']);
16 
17 ?>
Dará como resultado:
 1 Valor con $valor[1]:casa
 2 Valor con $valor['value']:casa
 3 Clave con $valor[0]:0
 4 Clave con $valor['key']:0
 5 Lendo outro novo dato do array...
 6 
 7 Valor con $valor[1]:can
 8 Valor con $valor['value']:can
 9 Clave con $valor[0]:1
10 Clave con $valor['key']:1
Nota: Lembrar que se estamos a percorrer o array antes de chegar a este código pode ser necesario 'resetear' o punteiro á posición inicial coa función reset().
  • Podemos utilizar unha estrutura de bucle para repetir a operación ata que chegue ao final:
1 <?php
2         $datos = ['casa','can','amigo','coche'];
3         echo "Dentro dun bucle...<br />";
4         while($valor=each($datos)){
5             printf("<br />Valor con \$valor['value']:%s",$valor['value']);
6             printf("<br />Clave con \$valor['key']:%s",$valor['key']);
7         }
8         echo "<br />Acabou o bucle<br />";
9 ?>
Dará como resultado:
 1 Dentro dun bucle...
 2 
 3 Valor con $valor['value']:casa
 4 Clave con $valor['key']:0
 5 Valor con $valor['value']:can
 6 Clave con $valor['key']:1
 7 Valor con $valor['value']:amigo
 8 Clave con $valor['key']:2
 9 Valor con $valor['value']:coche
10 Clave con $valor['key']:3
11 Acabou o bucle
Nota: Lembrar que se estamos a percorrer o array antes de chegar a este código pode ser necesario 'resetear' o punteiro á posición inicial coa función reset().


  • Relacionada coa función 'each' temos as seguintes funcións que modifican a posición do punteiro dentro do array:
  • función reset(): Establece o punteiro do array ao primeiro elemento.
  • función current(): Devolve o elemento actual ao que estar a apuntar o punteiro do array.
  • función next(): Avanza o punteiro unha posición cara adiante e devolve o elemento.
  • función prev(): Rebobina o punteiro unha posición cara atrás e devolve o elemento.

Eliminando elementos do array

  • Desta forma podemos eliminar os elementos do array dentro do bucle sen que pase nada.
Por exemplo:
 1 <?php
 2         echo "Dentro dun bucle...<br />";
 3         while($valor=each($datos)){
 4             if ($valor['key']==1){
 5                 unset($valor['value']);
 6             }
 7             else {
 8                 printf("<br />Valor con \$valor['value']:%s",$valor['value']);
 9                 printf("<br />Clave con \$valor['key']:%s",$valor['key']);
10             }
11         }
12         echo "<br />Acabou o bucle<br />";
13 ?>
Dará como resultado:
1 Dentro dun bucle...
2 
3 Valor con $valor['value']:casa
4 Clave con $valor['key']:0
5 Valor con $valor['value']:amigo
6 Clave con $valor['key']:2
7 Valor con $valor['value']:coche
8 Clave con $valor['key']:3
9 Acabou o bucle
Como vemos o elemento con valor de clave 1 foi eliminado dentro do bucle.

Accedendo aos valores gardados no array (4ª forma)

  • A sintaxe é a seguinte:
1 foreach (expresión_array as $valor) {
2     sentencias
3 }
4 
5 OU
6 
7 foreach (expresión_array as $clave => $valor) {
8     sentencias
9 }
Na primeira forma recuperamos o valor de cada elemento do array en cada iteración do bucle for.
Na segunda forma recuperamos o valor e a clave de cada elemento do array en cada iteración do bucle for.
Vexamos un exemplo:
1 <?php
2         $datos = ['casa','can','amigo','coche'];
3         
4         foreach($datos as $valor){
5             printf("O valor é:%s<br />",$valor);
6         }
7 ?>
Dará como resultado:
1 O valor é:casa
2 O valor é:can
3 O valor é:amigo
4 O valor é:coche
  • Outro exemplo empregando a segunda forma:
1 <?php
2         $datos = ['casa','can','amigo','coche'];
3         
4         foreach($datos as $clave => $valor){
5             printf("O valor da clave é: %s<br />",$clave);
6             printf("O valor é: %s<br />",$valor);
7         }
8 ?>
Dará como resultado:
1 O valor da clave é: 0
2 O valor é: casa
3 O valor da clave é: 1
4 O valor é: can
5 O valor da clave é: 2
6 O valor é: amigo
7 O valor da clave é: 3
8 O valor é: coche

Funcións predefinidas relacionadas cos Arrays

Algunha delas son:

Función list

A idea é que partindo dun array poidamos asociar a variables os valores gardados no array dunha forma rápida.
Por exemplo:
1 <?php
2 $array = array("un", "dous", "tres", "catro");
3 
4 ?>
Se eu quero gardar cada elemento do array nunha variable tería que facer:
1 <?php
2           $array = array("un", "dous", "tres", "catro");
3 
4           $var1=$array[0];
5           $var2=$array[1];
6           $var3=$array[2];
7           $var4=$array[3];
8 
9 ?>
Pero usando list se pode facer:
1 <?php
2           $array = array("un", "dous", "tres", "catro");
3           list($var1,$var2,$var3,$var4)=$array;
4 ?>
Incluso se poden 'saltar' elementos do array:
1 <?php
2           $array = array("un", "dous", "tres", "catro");
3           list(,$var2,,$var4)=$array;
4 ?>

Función explode

O conxunto de valores virán nunha única variable separados por algún carácter (espazo en branco, coma,...)
Será necesario indicar na chamada á función o carácter de separación.
  • Por exemplo:
1 <?php
2         $datos= "un | dous | tres | catro";
3         $array=  explode('|', $datos);
4         print_r($array);
5 ?>
Dará como resultado:
1 Array ( [0] => un 
2         [1] => dous 
3         [2] => tres 
4         [3] => catro 
5       )


Función implode

  • Función implode: Fai o proceso contrario á función anterior. Converte un array a unha variable de cadea no que o seu valor é o conxunto de valores do array unidos cun carácter que ven indicado na función.
  • Por exemplo:
1 <?php
2         $array = ['casa','can','amigo'];
3         $cadea=  implode('|', $array);
4         echo $cadea;
5 ?>
Dará como resultado:
1 casa|can|amigo

Verificando os datos dun formulario

  • Uhna forma rápida de verificar que certos datos dun formulario teñan información sería:
 1 <?php  
 2 // Campos obrigatorios
 3 $campos_obrigatorios = array('txtNome', 'txtEmail');
 4 
 5 // Comprobamos que os campos obrigatorios teñan datos
 6 $erro = false;
 7 foreach ($campos_obrigatorios as $campo) {
 8   if (empty($_POST[$campo])) $erro = true;
 9 }
10 
11 if ($erro) {
12   // Non existe algún dos campos obrigatorios
13 }




-- Ángel D. Fernández González -- (2016).