JavascriptProva

mercoledì 2 maggio 2018

Array indicizzati e associativi, e costrutti iterativi applicabili, in php

Ci sono dunque tre tipi di array in php:
  • indexed
  • associativo
  • multidimensionale

Cominciamo con gli indexed...

Vado a memoria nel creare un array:
<?php
$nani=array("Mammolo","Gongolo","Cucciolo","Pisolo","Brontolo","Dotto","Eolo");

echo "I nani di Biancaneve sono ".count($nani)."<br>";

echo "I loro nomi sono: ";
for($n=0;$n<count($nani);$n++){
    echo "$nani[$n],";
}

?> 
I nani di Biancaneve sono 7
I loro nomi sono: Mammolo,Gongolo,Cucciolo,Pisolo,Brontolo,Dotto,Eolo,

E ho usato la funzione count() e un ciclo for per contare gli elementi dell'array e navigarci in mezzo.


Ora la cosa più difficile: degli array che non hanno un indice numerico ma una variabile.
Per prima cosa, mi rivedrei i cicli foreach, che qui vanno senz'altro applicati.
Applico foreach a un array indicizzato.
<?php
$matrice=array("uno","due","tre","quattro");

foreach($matrice as $value){
    echo "$value<br>";
}


?> 
uno
due
tre
quattro



Se voglio far apparire anche l'indice:
<?php
$matrice=array("uno","due","tre","quattro");

foreach($matrice as $x=>$value){
    echo "$value<br>";
}
?> 
uno
due
tre
quattro
Così l'indice non appare, ma dal momento che ho eguagliato $matrice a $x=>$value posso far apparire anche l'indice:
<?php
$matrice=array("uno","due","tre","quattro");

foreach($matrice as $x=>$value){
    echo "$x $value<br>";
}
?> 
0 uno
1 due
2 tre
3 quattro
Ecco: eguagliando $matrice a $x=>$value ho compreso in essa anche l'indice.
Stessa cosa posso fare per un array associativo.

Creo un array associativo (in questo tipo di array sarebbe il caso di far apparire anche l'indice)
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");
Ora voglio elencarli tutti, facendo apparire anche l'indice che in questo caso è il nome del dio.
<?php
$dei = array("Zeus"=>"Fulmine","Ares"=>"Guerra","Afrodite"=>"Amore","Dioniso"=>"Vino","Atena"=>"Sapienza");

foreach($dei as $nome=>$competenza){
    echo "$nome: $competenza<br>";
}
Zeus: Fulmine
Ares: Guerra
Afrodite: Amore
Dioniso: Vino
Atena: Sapienza

Ecco, appunto, come volevo.
Il for è applicabile solo agli array indicizzati perché hanno come indice un numero, mentre il foreach è applicabile sia agli array indicizzati che a quelli associativi.

Parametri opzionali in php (con una digressione in Java)

A proposito delle funzioni, il primo argomento che mi salta all'occhio è quello dei parametri opzionali con un valore di default.
In Java non mi pare che esista questa funzione, mentre esiste (se ricordo bene) in C.
No, infatti non esiste.
Andiamo in php:
<?php
function funzione($a,$b=3){
    echo "$a<br>";
    echo $b;
}
funzione(3);
?> 
Il default è 3.
3
3

Se invece metto un secondo parametro diverso dal valore di default:
<?php
function funzione($a,$b=3){
    echo "$a<br>";
    echo $b;
}
funzione(3,5);
?> 
3
5
Funziona!
A questo punto faccio una digressione perché non so come si crei un parametro di default in Java.
Ecco: mediante l'overloading del metodo:
    private void funzione(int parametro1, int parametro2){
        System.out.println(parametro1 + " "+parametro2);

    }

    private void funzione(int parametro1){
        int defaultparam=7;
        funzione(parametro1,defaultparam);
    }
...dato che non esiste la possibilità di creare direttamente parametri opzionali.

Cicli while e for in php (sintassi uguale a quella del Java ecc.)

Cicli While e For in php.

<?php
$contatore=0;
while($contatore < 10){
    echo $contatore;
    $contatore++;
}
?>
0123456789

E così anche per:
<?php
$contatore=0;
do{
    echo $contatore;
    echo "<br>";
    $contatore++;
}while($contatore<10);
?>
0
1
2
3
4
5
6
7
8
9


Ciclo for:
<?php
for($n=0;$n<5;$n++){
    echo("Ciao, bello! <br>");
}
?> 
Ciao, bello! 
Ciao, bello! 
Ciao, bello! 
Ciao, bello! 
Ciao, bello! 

Il ciclo for è praticamente uguale a quello degli altri linguaggi OOP, con la differenza che essendo il php poco tipizzato non bisogna inserire alcun tipo della variabile.

C'è poi il ciclo foreach, che lavora sugli array, e così sarà un'occasione per ripassare gli array.
Creo un array in php:
<?php
$nani=array("Gongolo","Mammolo","Pisolo","Brontolo","Eolo","Dotto","Cucciolo");

foreach($nani as $value){
    echo "$value <br>";
}
?> 
Gongolo 
Mammolo 
Pisolo 
Brontolo 
Eolo 
Dotto 
Cucciolo 

Ricordare sempre che le variabili del php possono andare anche tra virgolette!.

Strutture decisionali in php: verifico se la sintassi è uguale a quella del Java.

Proviamo a vedere se le istruzioni condizionali sono simili a quelle del Java...

Ho una variabile: se la variabile contiene il nome "Mario" verrà scritto "Rossi", se contiene il nome "Ciccio" verrà scritto "Molliccio", se contiene un altro nome verrà scritto "Altro cognome".
<?php
$nome="Ciccio";

if($nome=="Mario"){
    echo "Rossi";
}elseif($nome=="Ciccio"){
    echo "Molliccio";
}else{
    echo "Altro cognome";
}
?> 
Funziona perfettamente!
Ora vediamo con lo switch:
<?php
$nome="Ciccio";

switch($nome){
    case "Mario":
        echo "Rossi";
        break;
    case "Ciccio":
        echo "Molliccio";
        break;
    default:
        echo "Altro cognome";
        break;
}
?> 
E funziona perfettamente anche questo!
La sintassi è uguale a quella del Java.

Costanti in php

Le costanti in php...
Vediamole!

La parola chiave è define.
Creo una costante e la visualizzo fuori e dentro una funzione (le costanti dovrebbero essere visibili dappertutto).
<?php
define("PAROLACCIA","Vaffanculo");
echo PAROLACCIA;
echo "<br>";
function funzione(){
    echo PAROLACCIA." dentro la funzione";
}
funzione();
?> 
Vaffanculo
Vaffanculo dentro la funzione

Perfetto!

Ora faccio il confronto con una variabile.
<?php
define("PAROLACCIA","Vaffanculo");
$variabile="Stronzo";
echo PAROLACCIA;
echo "<br>";
echo $variabile;
echo "<br>";
function funzione(){
    echo PAROLACCIA." dentro la funzione";
    echo "<br>";
    echo $variabile;
}
funzione();
?>
Vaffanculo
Stronzo
Vaffanculo dentro la funzione

Notice: Undefined variable: variabile in /storage/ssd3/737/3147737/public_html/index.php on line 11
Per rendere leggibile la variabile (ripasso) ho due possibilità:

parola chiave global:
<?php
define("PAROLACCIA","Vaffanculo");
$variabile="Stronzo";
echo PAROLACCIA;
echo "<br>";
echo $variabile;
echo "<br>";
function funzione(){
    global $variabile;
    echo PAROLACCIA." dentro la funzione";
    echo "<br>";
    echo $variabile;
}
funzione();
?>
Vaffanculo
Stronzo
Vaffanculo dentro la funzione
Stronzo



attingendo all'array $GLOBALS.
<?php
define("PAROLACCIA","Vaffanculo");
$variabile="Stronzo";
echo PAROLACCIA;
echo "<br>";
echo $variabile;
echo "<br>";
function funzione(){
    echo PAROLACCIA." dentro la funzione";
    echo "<br>";
    echo $GLOBALS['variabile'];
}
funzione();
?>
Vaffanculo
Stronzo
Vaffanculo dentro la funzione
Stronzo

Perfetto!
Resta da vedere quel "case insensitive"...

Provo a scrivere in minuscolo il nome della costante:
<?php
define("PAROLACCIA","Vaffanculo");
echo PAROLACCIA;
echo "<br>";
function funzione(){
    echo parolaccia." dentro la funzione";
}
funzione();
?> 
E ottengo:
Vaffanculo

Notice: Use of undefined constant parolaccia - assumed 'parolaccia' in /storage/ssd3/737/3147737/public_html/index.php on line 6
parolaccia dentro la funzione

Ora definisco la costante con un true come terzo parametro, che rende il nome case insensitive:
<?php
define("PAROLACCIA","Vaffanculo",true);
echo PAROLACCIA;
echo "<br>";
function funzione(){
    echo parolaccia." dentro la funzione";
}
funzione();
?>
Vaffanculo
Vaffanculo dentro la funzione

ed ecco che il nome della costante non è più case sensitive ma si può scrivere anche in minuscolo.

martedì 1 maggio 2018

Alcune operazioni sulle stringhe in php.

Devo passare per le stringhe.
Vediamo... se ricordo bene, ci sono delle funzioni per contare il numero di caratteri di una stringa e il numero di parole contenute in essa.
strlen()
str_word_count()
Provo ad applicarle...

<?php
$stringa="Ciao bello vai a quel paese";
var_dump($stringa);
?>
string(27) "Ciao bello vai a quel paese"

Applichiamo le funzioni di cui sopra:
<?php
$stringa="Ciao bello vai a quel paese";
var_dump($stringa);
echo "<br>";
echo "Numero di caratteri della stringa ".strlen($stringa);
echo "<br>";
echo "Numero di parole della stringa ".str_word_count($stringa);
?> 
string(27) "Ciao bello vai a quel paese" 
Numero di caratteri della stringa 27
Numero di parole della stringa 6

Perfetto!
C'è anche una funzione che inverte la stringa, strrev().
Più una curiosità, direi... Proviamo:
<?php
$stringa="Ciao bello vai a quel paese";

echo "<br>";
echo "Numero di caratteri della stringa ".strlen($stringa);
echo "<br>";
echo "Numero di parole della stringa ".str_word_count($stringa);
echo "<br>";
echo "Stringa al contrario ".strrev($stringa);
?> 
Numero di caratteri della stringa 27
Numero di parole della stringa 6
Stringa al contrario eseap leuq a iav olleb oaiC
Sì, una simpatica curiosità!
Più interessanti sono le funzioni che cercano un testo all'interno di un altro testo e sostituiscono testo con altro testo.
Ne ho due, strpos() e str_replace().
Le provo...

<?php
$stringa="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita";

echo strpos($stringa,"cammin");
?>
14

Sì, corrisponde.
Ora con str_replace voglio sostituire alcune parole della frase.
<?php
$stringa="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura che la diritta via era smarrita";

echo str_replace("selva oscura","cazzo di foresta buia che non si vedeva una minchia",$stringa);
?>
Nel mezzo del cammin di nostra vita mi ritrovai per una cazzo di foresta buia che non si vedeva una minchia che la diritta via era smarrita

Perfetto (chiedo perdono al Sommo...)

Overriding di un metodo e uso dell'operatore di scope per eseguire il metodo della classe base in php

Vediamo di fare un overriding di un metodo di una classe, e quindi di accedere al metodo della classe genitrice.

Inventiamo una classe...

Non ho ancora indagato se esistano in php le classi astratte.
Comunque, facciamo che la classe triangolo sia derivata della classe rettangolo, anche se ci starebbe meglio una classe astratta...

<?php

class rettangolo{
    private $area;
    private $base;
    private $altezza;
    
    function __construct($b, $a){
        $this->base=$b;
        $this->altezza=$a;
    }
    
    public function get_area(){
        return $this->base * $this->altezza;
    }
}

class triangolo extends rettangolo{
    function __construct($b,$a){
        $this->base=$b;
        $this->altezza=$a;
    }

    public function get_area(){
        return ($this->base * $this->altezza)/2;
    }
}

$myrect=new rettangolo(4,5);
echo "Area del rettangolo ".$myrect->get_area();
echo "<br>";
$mytrg=new triangolo(4,5);
echo "Area del triangolo ".$mytrg->get_area();
?> 
I risultati sono come mi attendo:
Area del rettangolo 20
Area del triangolo 10

Dunque ho overridato il metodo get_area().
Ora voglio usare l'operatore di scope (non so se anche in php si chiama così) per accedere al metodo della classe base.
<?php

class rettangolo{
    protected $base;
    protected $altezza;
    function __construct($b,$a){
        $this->base=$b;
        $this->altezza=$a;
    }
    
    public function get_area(){
        return $this->base * $this->altezza;;
    }
}

class triangolo extends rettangolo{

    function __construct($b, $a){
        $this->base=$b;
        $this->altezza=$a;
    }

    public function get_area(){
        return rettangolo::get_area();
    }
}

$myrect=new rettangolo(4,5);
echo "Area del rettangolo ".$myrect->get_area();
echo "<br>";
$mytrg=new triangolo(4,5);
echo "Area del triangolo ".$mytrg->get_area()
?> 
Area del rettangolo 20
Area del triangolo 20

Perfetto!