Pertanyaan Sortasi susunan kustom menggunakan nilai string


Katakanlah saya memiliki larik ini:

$array = array(
    array("id" => 7867867, "animal" => "Dog"),
    array("id" => 3452342, "animal" => "Lion"),
    array("id" => 1231233, "animal" => "Lion"),
    array("id" => 5867867, "animal" => "Dog"),
    array("id" => 1111111, "animal" => "Zeebra"),
    array("id" => 2222222, "animal" => "Cat"),
    array("id" => 3333333, "animal" => "Cat"),
    array("id" => 4444444, "animal" => "Zeebra")
);

Sekarang yang saya coba lakukan adalah menggunakan fungsi semacam php untuk dapat mengurutkan berdasarkan aturan tertentu (tidak sesuai abjad)

Klien menginginkan informasi ini diurutkan berdasarkan "Singa pertama, Anjing kedua, Zeebra ketiga, Cat keempat".

Sesuatu seperti ini:

$array = array(
    array("id" => 3452342, "animal" => "Lion"),
    array("id" => 1231233, "animal" => "Lion"),
    array("id" => 7867867, "animal" => "Dog"),
    array("id" => 5867867, "animal" => "Dog"),
    array("id" => 4444444, "animal" => "Zeebra"),
    array("id" => 1111111, "animal" => "Zeebra"),
    array("id" => 2222222, "animal" => "Cat"),
    array("id" => 3333333, "animal" => "Cat"),
);

Array akan disortir menggunakan nilai "hewan" dan akan didasarkan pada aturan yang telah ditentukan.

Saya mencoba untuk mencari tahu fungsi-fungsi semacam php tetapi saya hanya bisa mendapatkannya dengan menyortir array secara alfabet atau numerik.

Apa yang saya dapatkan adalah blokir if-statement and loops, dan saya ingin menyingkirkan kode lambat itu secepat yang saya bisa.


4
2018-04-28 22:18


asal


Jawaban:


Menggunakan saran Jonathan untuk menggunakan usort, Anda dapat menentukan aturan kustom Anda untuk menyortir dalam fungsi terpisah, seperti:

function getAnimalValue($animal) {
    switch($animal) {
        case 'Lion':
            return 1;
        case 'Dog':
            return 2;
        case 'Zeebra':
            return 3;
        case 'Cat':
            return 4;
    }
    return 0;
}

Kemudian, terapkan fungsi perbandingan Anda sendiri:

function compare($itemA, $itemB) {
    $a = getAnimalValue($itemA['animal']);
    $b = getAnimalValue($itemB['animal']);
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

Akhirnya, panggil usort menggunakan fungsi bandingkan:

usort($array, "compare");

6
2018-04-28 22:37



Periksa usort. Berikut referensinya:

http://www.php.net/manual/en/function.usort.php

Contoh:

function cmp($a, $b) {
    $order=array("Lion","Dog","Zebra","Cat");
    if ($a["animal"] == $b["animal"]) {
        return 0;
    }
    return (array_search($a["animal"],$order) < array_search($b["animal"],$order)) ? -1 : 1;
}

$array = array(
    array("id" => 7867867, "animal" => "Dog"),
    array("id" => 3452342, "animal" => "Lion"),
    array("id" => 1231233, "animal" => "Lion"),
    array("id" => 5867867, "animal" => "Dog"),
    array("id" => 1111111, "animal" => "Zebra"),
    array("id" => 2222222, "animal" => "Cat"),
    array("id" => 3333333, "animal" => "Cat"),
    array("id" => 4444444, "animal" => "Zebra")
);

$mySortedArray=usort($array, "cmp");

1
2018-04-28 22:21



Ini sedikit cara yang jelek, tetapi itu berhasil.

// Set our rules, the key is the order
$rules = array(0=>"Dog",1=>"Lion",2=>"Zeebra",3=>"Cat");

// Our array
$array = array(
    array("id" => 7867867, "animal" => "Dog"),
    array("id" => 3452342, "animal" => "Lion"),
    array("id" => 1231233, "animal" => "Lion"),
    array("id" => 5867867, "animal" => "Dog"),
    array("id" => 1111111, "animal" => "Zeebra"),
    array("id" => 2222222, "animal" => "Cat"),
    array("id" => 3333333, "animal" => "Cat"),
    array("id" => 4444444, "animal" => "Zeebra")
);

// Split each animal into a arrays per animal
foreach( $array as $item ){
    $animals[ $item['animal'] ][] = $item;
}

// Loop our rules (dogs, then lions, etc) and put our mini arrays in a final sorted_array.
foreach( $rules as $animal_order => $animal_name ){
    foreach( $animals[$animal_name] as $animal ){
        $sorted_animals[] = $animal;
    }

}

print_r($sorted_animals);

0
2018-04-28 22:36



Mencoba:

function sortByAnimals($array, $animalOrderArray){
  foreach($animalOrderArray as $v){
    $aa[$v] = array();
  }
  foreach($array as $a){
    foreach($aa as $i => $v){
      if(preg_match("/^{$a['animal']}$/i", $i)){
        array_push($aa[$i], $a);
        break;
      }
    }
  }
  foreach($aa as $a){
    foreach($a as $v){
      $r[] = $v;
    }
  }
  return $r;
}
$resArray = sortByAnimals($array, array('lion', 'dog', 'zeebra', 'cat'));

0
2018-04-28 23:13