Rumah  >  Artikel  >  pembangunan bahagian belakang  >  PHP array_map untuk tatasusunan bersekutu – Petua Pantas

PHP array_map untuk tatasusunan bersekutu – Petua Pantas

Barbara Streisand
Barbara Streisandasal
2024-10-26 07:59:30517semak imbas

Jika anda berada di sini, anda mungkin sudah sedar bahawa fungsi array_map tidak membenarkan akses kepada kekunci tatasusunan dalam panggilan balik. Mempunyai kunci selain daripada nilai boleh menjadi sangat berguna berurusan dengan tatasusunan bersekutu (tatasusunan dengan kunci rentetan).

Saya akan menunjukkan kepada anda kes penggunaan saya untuk penyelesaian ini dan fungsi baharu yang saya laksanakan.

Untuk lebih banyak artikel teknikal, anda boleh mengikuti saya di Linkedin atau X.

array_map Use Case

Kes penggunaan dunia sebenar biasa untuk fungsi tatasusunan PHP adalah mengubah data daripada pertanyaan pangkalan data atau respons API. Sebagai contoh, katakan anda mempunyai tatasusunan data pengguna dan anda ingin memformat nama pengguna atau mengekstrak maklumat tertentu daripada setiap rekod pengguna.

Bayangkan anda mempunyai tatasusunan rekod pengguna dan setiap rekod ialah tatasusunan bersekutu dengan kunci seperti first_name, last_name dan e-mel:

// Array of user data (e.g., from a database query)
$users = [
    [
        'first_name' => 'John',
        'last_name' => 'Doe',
        'email' => 'john.doe@example.com'
    ],
    [
        'first_name' => 'Jane',
        'last_name' => 'Smith',
        'email' => 'jane.smith@example.com'
    ],
    [
        'first_name' => 'Bob',
        'last_name' => 'Johnson',
        'email' => 'bob.johnson@example.com'
    ]
];

Senario 1: ekstrak maklumat

Anda boleh mengekstrak senarai alamat e-mel dengan mudah untuk menghantar pemberitahuan kepada:

$emails = array_map(function($user) {
    return $user['email'];
}, $users);

// Result: ['john.doe@example.com', 'jane.smith@example.com', 'bob.johnson@example.com']

Senario 2: tambah maklumat

Anda boleh menggunakan fungsi array_map untuk menambah medan baharu pada objek pengguna berdasarkan maklumat mereka:

// Using array_map to add the avatar field to each user
$result = array_map(function($user) {
    return array_merge(
        $user,
        [
            'avatar' => 'https://eu.ui-avatars.com/api/?background=ff7511&color=fff&name='.$user['first_name']
        ]
    );
}, $users);


// Output the result
var_dump($result);

Gunakan Kes Untuk Tatasusunan Bersekutu

Saya membuat pengekstrakan data daripada pangkalan data NoSQL untuk mencipta carta pada papan pemuka produk saya. Data yang saya terima daripada pangkalan data NoSQL kelihatan seperti ini:

$data = [
    "2024-08-25" => ["doc_count" => 523, "score" => 0.2, "skipped" => 0],
    "2024-08-24" => ["doc_count" => 423, "score" => 0.2, "skipped" => 0],
    "2024-08-23" => ["doc_count" => 453, "score" => 0.2, "skipped" => 0],
    "2024-08-22" => ["doc_count" => 267, "score" => 0.2, "skipped" => 0],
    "2024-08-21" => ["doc_count" => 378, "score" => 0.2, "skipped" => 0],
    "2024-08-20" => ["doc_count" => 325, "score" => 0.2, "skipped" => 0],
    "2024-08-19" => ["doc_count" => 501, "score" => 0.2, "skipped" => 0],
];

Oleh kerana perpustakaan javascript yang digunakan untuk menggambarkan carta, saya perlu mengubah data ini ke dalam format di bawah untuk menjadikan kehidupan lebih mudah bagi pembangun bahagian hadapan:

$result = [
    [
        "label" => "2024-08-25",
        "value" => 523
    ],
    [
        "label" => "2024-08-24",
        "value" => 423
    ],

    ...
];

Tetapi untuk melakukan transformasi ini saya memerlukan akses kepada kunci tatasusunan asal untuk meletakkannya ke dalam medan "label". Tetapi fungsi peta tatasusunan lalai hanya membenarkan akses nilai.

Berikut ialah pelaksanaan fungsi array_map_assoc yang berfungsi dengan tatasusunan bersekutu. Ia menyediakan kedua-dua kunci dan nilai sebagai hujah bagi panggilan balik:

/**
 * Apply a mapping callback receiving key and value as arguments.
 * The standard array_map doesn't pass the key to the callback. But in the case of associative arrays,
 * it could be really helpful.
 *
 * array_map_assoc(function ($key, $value) {
 *  ...
 * }, $items)
 *
 * @param callable $callback
 * @param array $array
 * @return array
 */
function array_map_assoc(callable $callback, array $array): array
{
    return array_map(function($key) use ($callback, $array){
        return $callback($key, $array[$key]);
    }, array_keys($array));
}

Kini saya boleh mengubah tatasusunan pengguna asal dalam format data untuk pustaka carta javascript:

$histogram = array_map_assoc(function ($key, $value) {
    return [
        'label' => $key,
        'value' => $value['doc_count']
    ];
}, $data);

Nota

Berhati-hati kerana fungsi array_map_assoc tidak mengekalkan keadaan kunci rentetan, tetapi ia menghasilkan tatasusunan standard yang baharu sepenuhnya.

Saya juga menambah fungsi ini ke dalam ruang nama global dalam aplikasi Laravel saya sebagai fungsi pembantu baharu:

https://inspector.dev/laravel-custom-helper-functions-fast-tips/

Mengapa tidak menggunakan foreach?

Lebih ramai pembangun berpengalaman mungkin berfikir bahawa anda boleh mengakses kunci dan nilai hanya menggunakan pernyataan foreach:

foreach ($data as $date => $value) {
    ...
}

Menggunakan foreach, anda perlu menggunakan pembolehubah tambahan untuk menyimpan transformasi yang terhasil dan anda tidak boleh menstruktur kod dalam pernyataan "satu baris".

// Array of user data (e.g., from a database query)
$users = [
    [
        'first_name' => 'John',
        'last_name' => 'Doe',
        'email' => 'john.doe@example.com'
    ],
    [
        'first_name' => 'Jane',
        'last_name' => 'Smith',
        'email' => 'jane.smith@example.com'
    ],
    [
        'first_name' => 'Bob',
        'last_name' => 'Johnson',
        'email' => 'bob.johnson@example.com'
    ]
];

Untuk lebih banyak artikel teknikal, anda boleh mengikuti saya di Linkedin atau X.

Pantau aplikasi PHP anda secara percuma

Inspektor ialah alat Pemantauan Pelaksanaan Kod yang direka khusus untuk pembangun perisian. Anda tidak perlu memasang apa-apa di peringkat pelayan, cuma pasang pakej Laravel atau Symfony dan anda sudah bersedia untuk pergi.

Jika anda sedang mencari pemantauan HTTP, cerapan pertanyaan pangkalan data dan keupayaan untuk memajukan makluman dan pemberitahuan ke dalam persekitaran pemesejan pilihan anda, cuba Inspektor secara percuma. Daftar akaun anda.

Atau ketahui lebih lanjut di tapak web: https://inspector.dev

PHP array_map for associative array – Fast Tips

Atas ialah kandungan terperinci PHP array_map untuk tatasusunan bersekutu – Petua Pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn