Başka bir dizi dayalı bir dizi sıralamak?

7 Cevap php

Böyle bir şey yapmak için PHP mümkün mü? Nasıl bir işlevi yazma hakkında gitmek istiyorsunuz? İşte bir örnek. Sırası en önemli şeydir.

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

Ve ben böyle bir şey yapmak istiyorum

$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));

Sonunda bir foreach () kullanın ve doğru sırayla olması gereken bir dize değerleri ekleme ve ben önceden dizi tüm tuşları bilmiyorum çünkü / (doğru sırayla değil çünkü değerleri).

PHP'nin dahili dizi fonksiyonları ile baktım ama sadece alfabetik veya sayısal olabilir gibi görünüyor.

7 Cevap

Buyrun:

function sortArrayByArray(Array $array, Array $orderArray) {
    $ordered = array();
    foreach($orderArray as $key) {
        if(array_key_exists($key,$array)) {
            $ordered[$key] = $array[$key];
            unset($array[$key]);
        }
    }
    return $ordered + $array;
}

Sadece array_merge kullanın. Bu (doğru sırayla) bunu vermek dizisi ile başlayan ve yazılmadan / gerçek dizi verilerle anahtarlarını ekleyerek çalışır:

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);

//$properOrderedArray -> array('name' => 'Tim', 'address' => '123 fake st', 'dob' => '12/08/1986', 'dontSortMe' => 'this value doesnt need to be sorted')

ps - Ben önceki cevaplar overkill gibi tüm döngüler verilen düşünüyorum çünkü ben, bu 'bayat' sorusunu cevap veriyorum.

PHP> = 5.3.0 için başka bir yolu:

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

$customerSorted = array_replace(array_flip(array('name', 'dob', 'address')), $customer);

Sonuç:

Array (
  [name] => Tim
  [dob] => 12/08/1986
  [address] => 123 fake st
  [dontSortMe] => this value doesnt need to be sorted
)

Dize ve sayısal tuşları ile çalışıyor.

Sipariş olarak bir dizi atın:

$order = array('north', 'east', 'south', 'west');

Kullandığınız değerlere dayalı başka bir dizi sıralamak array_intersect ­Docs :

/* sort by value: */
$array = array('south', 'west', 'north');
$sorted = array_intersect($order, $array);
print_r($sorted);

Ya da senin durumunda, tuşları ile sıralamak için kullanabileceğiniz array_intersect_key ­Docs :

/* sort by key: */
$array = array_flip($array);
$sorted = array_intersect_key(array_flip($order), $array);
print_r($sorted);

Her iki fonksiyon ilk parametre sırasını tutacak ve sadece ikinci diziden değerleri (veya anahtarları) dönecektir.

Yani bu iki standart durumlarda sizin için sıralama / yeniden düzenlenmesi gerçekleştirmek için kendi üzerinde bir işlevi yazmak gerekmez.

Eğer dizideki dizi varsa, Eran tarafından biraz adaptasyon fonksiyonu gerekecek ...

function sortArrayByArray($array,$orderArray) {
    $ordered = array();
    foreach($orderArray as $key => $value) {
        if(array_key_exists($key,$array)) {
                $ordered[$key] = $array[$key];
                unset($array[$key]);
        }
    }
    return $ordered + $array;
}

İlk Öneri

 function sortArrayByArray($array,$orderArray) {
        $ordered = array();
        foreach($orderArray as $key) {
            if(array_key_exists($key,$array)) {
                    $ordered[$key] = $array[$key];
                    unset($array[$key]);
            }
        }
        return $ordered + $array;
    }

İkinci Öneri

$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);

Ben bu önerilerden ikisi de harika olduğuna işaret etmek istedim. Ancak, elma ve portakal vardır. Fark? Bir non-çağrışımlı dostu ve diğer dost çağrışımlı. Eğer 2 tam ilişkilendirilebilir diziler kullanıyorsanız o dizi birleştirme / çevirmek aslında birleştirme ve diğer ilişkisel dizi üzerine yazılır. Benim durumumda ben aradığım sonuç değildir. Ben sıralama düzeni dizi oluşturmak için bir settings.ini dosya kullanılır. Benim çağrışımlı meslektaşı sıralayarak üzerine yazılmış I sıralarken veri dizi gerek yoktu. Böylece dizi birleştirme benim veri dizisi mahveder. İkisi de büyük yöntemler, hem herhangi bir geliştirici araç kutusundaki arşivlenmiş gerekir. Ihtiyaçlarınıza göre size aslında arşivlerinde hem de kavramlara ihtiyaç bulabilirsiniz.

Ben onun kısalık için @ Darkwaltz4 gelen cevabı kabul ve dizi böylece gibi, her bir yineleme için farklı anahtarlar içerebilir durumlara çözüm adapte nasıl paylaşmak istiyorum:

Array[0] ...
['dob'] = '12/08/1986';
['some_key'] = 'some value';

Array[1] ...
['dob'] = '12/08/1986';

Array[2] ...
['dob'] = '12/08/1986';
['some_key'] = 'some other value';

gibi ve benzeri bir "ana anahtar" muhafaza:

$ Master_key = array ('DOB' => ',' some_key '=>');

array_merge [1] yineleme $ master_key dayalı ve yineleme için ['some_key'] ='', boş bir değer, üretilen Array birleştirme idam olurdu. Bu nedenle, array_intersect_key yüzden gibi her yineleme $ master_key değiştirmek için kullanıldı:

foreach ($customer as $customer) {
$modified_key = array_intersect_key($master_key, $unordered_array);
$properOrderedArray = array_merge($modified_key, $customer);
}