Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Menyusun Susunan PHP Berbilang Dimensi dengan Cekap mengikut Lajur, Termasuk Tarikh dan Kriteria Tersuai?

Bagaimana untuk Menyusun Susunan PHP Berbilang Dimensi dengan Cekap mengikut Lajur, Termasuk Tarikh dan Kriteria Tersuai?

Susan Sarandon
Susan Sarandonasal
2024-12-20 16:34:09920semak imbas

How to Efficiently Sort a Multidimensional PHP Array by Column, Including Dates and Custom Criteria?

Mengisih Tatasusunan Berbilang Dimensi dalam PHP: Pendekatan Fleksibel

Pertanyaan

Bagaimanakah anda mengatur tatasusunan berbilang dimensi dengan cekap berdasarkan lajur yang ditentukan, terutamanya apabila data termasuk tarikh dan anda inginkan kriteria pengisihan tersuai?

The Jawapan

Memperkenalkan Penyelesaian Dipertingkat untuk PHP 5.3

Penyelesaian ini menawarkan beberapa kelebihan:

  • Boleh Digunakan Semula: Tentukan lajur isihan sebagai a pembolehubah.
  • Fleksibel: Kendalikan berbilang lajur isihan dan pemecah seri kedua.
  • Boleh Balik: Isih sama ada dalam tertib menaik atau menurun untuk setiap lajur.
  • Boleh Diperluas: Gunakan unjuran tersuai untuk kompleks atau data bukan setanding.
  • Asosiatif: Gunakan usort atau uasort untuk keserasian dengan tatasusunan bersekutu.

Kod

function make_comparer() {
    // Normalize criteria
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion) ? array_pad($criterion, 3, null) : array($criterion, SORT_ASC, null);
    }

    return function ($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
            // Comparison details
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

            // Project and compare values
            $lhs = $projection ? call_user_func($projection, $first[$column]) : $first[$column];
            $rhs = $projection ? call_user_func($projection, $second[$column]) : $second[$column];

            // Determine the comparison result
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            } elseif ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        // Tiebreakers exhausted
        return 0;
    };
}

Penggunaan

Pertimbangkan sampel data:

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

Isih Asas:

  • Isih mengikut lajur "nama": usort($data, make_comparer('name'));

Isih dengan Berbilang Lajur:

  • Isih mengikut lajur "nombor" dan kemudian mengikut lajur berindeks sifar: usort($data, make_comparer('number', 0));

Terperinci Ciri:

  • Isih Songsang: Isih mengikut lajur "nama" menurun: usort($data, make_comparer(['name', SORT_DESC]));
  • Unjuran Tersuai: Unjurkan tarikh hari lahir hingga cap masa untuk mengisih: usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

Kes Penggunaan Kompleks:

  • Isih mengikut lajur "nombor" yang menurun, diikuti dengan lajur "hari lahir" yang diunjurkan menaik:

    usort($data, make_comparer(
      ['number', SORT_DESC],
      ['birthday', SORT_ASC, 'date_create']
    ));

Atas ialah kandungan terperinci Bagaimana untuk Menyusun Susunan PHP Berbilang Dimensi dengan Cekap mengikut Lajur, Termasuk Tarikh dan Kriteria Tersuai?. 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