Post

Array destructuring

Array destructuring

Kiedyś pisałem dosyć dużo kodu w javascript (es6). Wykorzystywałem różne możliwość języka, których później brakowało mi w php. Jedną z nich było tzw. destructuring assignment.

Przykład w ES6

1
2
3
4
const user = [1, 'name'];
const [id, name] = user;
console.log(id); // 1
console.log(name); // name

W php 5.6 też dało się coś takiego zrobić, ale tylko z użyciem funkcji list(). Natomiast w 7.1 już to według mnie wygląda bardziej przyjemnie.

PHP 5.6

1
2
3
4
$user = [1, 'name'];
list($id, $name) = $user;
var_dump($id); // 1
var_dump($name); // name

PHP 7.1

1
2
3
4
$user = [1, 'name'];
[$id, $name] = $user;
var_dump($id); // 1
var_dump($name); // name

Pętle

1
2
3
4
$user = ['id' => 1, 'name' => 'user'];
['id' => $id, 'name' => $name] = $user;
var_dump($id); // 1
var_dump($name); // name

Teraz rozważmy trochę szerszy przykład. Załóżmy, że mamy taką tablicę z danymi użytkowników.

1
2
3
4
5
$users = [
    ['id' => 1, 'name' => 'user', 'email' => 'user@test.com'],
    ['id' => 2, 'name' => 'user2', 'email' => 'user2@test.com'],
    ['id' => 3, 'name' => 'user3', 'email' => 'user3@test.com']
];

Chcemy teraz przetworzyć w pętli nazwę i email użytkownika. Można to zrobić w następujący sposób.

1
2
3
4
5
6
7
8
9
$users = [
    ['id' => 1, 'name' => 'user', 'email' => 'user@test.com'],
    ['id' => 2, 'name' => 'user2', 'email' => 'user2@test.com'],
    ['id' => 3, 'name' => 'user3', 'email' => 'user3@test.com']
];
foreach ($users as ['name' => $name, 'email' => $email]) {
    var_dump($name); // user, user2, user3
    var_dump($email); // user@test.com, user2@test.com, user3@test.com
}

Zagnieżdżenia

Dodatkowo możliwe jest również wydobywanie zagnieżdżonych elementów.

1
2
3
4
5
6
7
8
9
10
11
12
$user = [
    'id' => 1,
    'name' => 2,
    'address' => [
        'city' => 'Krakow',
        'street' => 'Wielicka'
    ]
];

['address' => ['city' => $city]] = $user;

var_dump($city); // Krakow
Unit Testing Tips - Kamil Ruczyński
This post is licensed under CC BY 4.0 by the author.