Array au porc

Ou comment les arrays engraissent nos projets

Array, c'est quoi ?

  • Liste
  • Conteneur associatif

Array, pour quoi ?

  • Liste (map) ordonnée
  • Liste (map) non ordonnée
  • Collection
  • Dictionnaire
  • Table d'association (hashtable)
  • Conteneur associatif
  • Stockage clé-valeur
  • Table de symboles
  • Ensemble (set)
  • Pile (stack / heap)
  • Graph
  • Arbre binaire
  • Queue
  • Etc…

Liste

Array

Objet

// Ordonnée :
$a = [100, 200, 300];

// Non ordonnée :
$b = [
	100 => 'a',
	0 => 'b',
	50 => 'c',
];

Pas besoin :

Un array est très bien pour ça

Collection

Array

Objet

$a = [
	new MyObject('test 1'),
	new MyObject('test 2'),
	new MyObject('test 3'),
];
class Collection
  implements
    \IteratorAggregate,
    \Countable
{
	// ...
}

$collection = new Collection();

$collection->add(new MyObject('test 1'));
$collection->add(new MyObject('test 2'));
$collection->add(new MyObject('test 3'));

Avantages:

  • Validation manuelle des doublons
  • Validation des types

Dictionnaire

Array

Objet

$a = [
	'option_1' => 'Valeur 1',
    'option_2' => 'Valeur 2',
];
class Dictionary
{
	// ...
}

$dictionary = new Dictionary();

$dictionary->set('option_1', 'Value 1');
$dictionary->set('option_2', 'Value 2');

// OU

class Dictionary implements \ArrayAccess, \Serializable
{
	// ...
}

$dictionary['option_1'] = 'Value 1';
$dictionary['option_2'] = 'Value 2';

(et hashmap, key-value store, tableau associatif, etc.)

Avantages:

  • Validation manuelle des doublons
  • Validation des types
  • Validation manuelle des valeurs

Graph

Array

Objet

$graph = [
    'A' => ['B' => 3, 'D' => 3, 'F' => 6],
    'B' => ['A' => 3, 'D' => 1, 'E' => 3],
    'C' => ['E' => 2, 'F' => 3],
    'D' => ['A' => 3, 'B' => 1, 'E' => 1, 'F' => 2],
    'E' => ['B' => 3, 'C' => 2, 'D' => 1, 'F' => 5],
    'F' => ['A' => 6, 'C' => 3, 'D' => 2, 'E' => 5],
];

😏

Utilisez une lib !

Array optimisé

Array

Objet

$data = [
	'Client 1',
    'Client 2',
];
$data = new \SplFixedArray(size: 2);

var_dump($data[0]); // null

$data[0] = 'Client 1';
$data[1] = 'Client 2';

// PHP Fatal error:  Uncaught OutOfBoundsException:
//     Index invalid or out of range
$data[2] = 'Out of bounds'; 

// Manual resize:
$data->setSize(3);
$data[2] = 'New item is now ok!';

Avantages : prend moins de place en mémoire

Stack, Heap, Linked List...

Stop talking, start objectifying arrays!

@pierstoval

Alex Rock

Freelance dev, architect, coach & trainer

Merci !