venerdì, agosto 30, 2013

PHP - Introduzione agli array

Questo post fa parte di una serie preparata qualche anno fa per delle lezioni su PHP.

Introduzione agli array

Gli array standard possono essere indicizzati da stringhe o da numeri. Ogni elemento di un array può essere un valore normale, un altro array o un oggetto (istanza di classe).

<?php

    $friends=Array(
        'Arthur',
        'Charlie',
        'Ben',
    );

    $friends[]='Donald';

    print_r($friends);
    sort($friends);
    print_r($friends);
    var_dump($friends);
    echo serialize($friends);

Cose da notare:

  • inizializzazione esplicita (in particolare, si veda la virgola anche dopo l'ultimo elemento, conviene che ci sia per future aggiunte)
  • aggiunta di un elemento all'array
  • funzioni varie per la gestione degli array

È lecito naturalmente anche inizializzare un array o un suo elemento con una chiave esplicitamente fornita, e valorizzarlo con oggetti o altri array:

<?php
    $images=Array(
        'bob' => new FamilyPicture('bob'),
        'cat' => new AnimalPicture('cat'),
    );

    $images['andrew']=Array(
        new FamilyPicture('andrew1'), new FamilyPicture('andrew2'),
        );

Funzioni predefinite

Per imparare a usare correttamente le funzioni relative agli array è conveniente costrursi degli esempi specifici. Ad esempio, con un codice come il seguente...

<pre>
<?php

    function line() {
        print(str_repeat("-=-", 10) . "\n");
    }

    $a1=array("Uno", "Due", "tre", "ch4"=>"quattro", "ch5"=>"cinque", "Sei");
    print "originale\n";
    print_r($a1);

    line();
    print "sort()\n";
    $a2=$a1;
    sort($a2);
    print_r($a2);

    line();
    print "ksort()\n";
    // risultati strani
    $a2=$a1;
    ksort($a2);
    print_r($a2);

    line();
    print "asort()\n";
    $a2=$a1;
    asort($a2);
    print_r($a2);

    function cmp($a, $b)
    {
        // si potrebbe usare strnatcasecmp al posto di questa
    if (strtoupper($a) == strtoupper($b)) {
        return 0;
        }
    return (strtoupper($a) < strtoupper($b)) ? -1 : 1;
    }
    line();
    print "usort(, \"cmp\")\n";
    $a2=$a1;
    usort($a2, "cmp");
    print_r($a2);

    line();
    print "uasort(, \"cmp\")\n";
    $a2=$a1;
    uasort($a2, "cmp");
    print_r($a2);

    line();
    line();
    line();

    $b=array(
        array('name'=>'mario', 'surname'=>'rossi', 'age'=>20),
        array('name'=>'giuseppe', 'surname'=>'verdi', 'age'=>40),
        array('name'=>'stefania', 'surname'=>'bianchi', 'age'=>30),
        array('name'=>'giorgia', 'surname'=>'neri', 'age'=>50),
  );
    
    function comparePersons($item1, $item2)
    {
    global $fieldname;
    return (strcmp($item2[$fieldname], $item2[$fieldname]));
    }
    $fieldname='surname';
    usort($b, 'comparePersons');
    print_r($b);

... otteniamo un output come questo:

originale
Array
(
[0] => Uno
[1] => Due
[2] => tre
[ch4] => quattro
[ch5] => cinque
[3] => Sei
)
-=--=--=--=--=--=--=--=--=--=-
sort()
Array
(
[0] => Due
[1] => Sei
[2] => Uno
[3] => cinque
[4] => quattro
[5] => tre
)
-=--=--=--=--=--=--=--=--=--=-
ksort()
Array
(
[ch4] => quattro
[0] => Uno
[ch5] => cinque
[1] => Due
[2] => tre
[3] => Sei
)
-=--=--=--=--=--=--=--=--=--=-
asort()
Array
(
[1] => Due
[3] => Sei
[0] => Uno
[ch5] => cinque
[ch4] => quattro
[2] => tre
)
-=--=--=--=--=--=--=--=--=--=-
usort(, "cmp")
Array
(
[0] => cinque
[1] => Due
[2] => quattro
[3] => Sei
[4] => tre
[5] => Uno
)
-=--=--=--=--=--=--=--=--=--=-
uasort(, "cmp")
Array
(
[ch5] => cinque
[1] => Due
[ch4] => quattro
[3] => Sei
[2] => tre
[0] => Uno
)
-=--=--=--=--=--=--=--=--=--=-
-=--=--=--=--=--=--=--=--=--=-
-=--=--=--=--=--=--=--=--=--=-
Array
(
[0] => Array
(
[name] => giorgia
[surname] => neri
[age] => 50
)

[1] => Array
(
[name] => stefania
[surname] => bianchi
[age] => 30
)

[2] => Array
(
[name] => giuseppe
[surname] => verdi
[age] => 40
)

[3] => Array
(
[name] => mario
[surname] => rossi
[age] => 20
)

)

Esercizio

A partire da un codice come il seguente

<html>
<head><title>sdf</title></head>
<body>
<pre>
<?php


$list=Array(
    'bob'=>1,
    'ada'=>2,
    'charlie'=>0,
);

sort($list);

print_r($list);

?>
</pre>
</body>
</html>

modificare il codice per ottenere:
a) un array ordinato per chiave anziché per valore;
b) un array ordinato per valore, dove però le chiavi sono preservate.

Nessun commento:

Posta un commento