Bir PHP dizi tuşları veya endeksi kullanıp kullanmadığını belirlemek [çoğaltmak]

6 Cevap php

Bu soru burada zaten bir cevabı var:

6 Cevap

Ben kullanışlı çanta o 'PHP araçları bu basit işlevleri vardır:

function is_flat_array($ar) {
    if (!is_array($ar))
        return false;

    $keys = array_keys($ar);
    return array_keys($keys) === $keys;
}

function is_hash($ar) { 
   if (!is_array($ar))
       return false;

   $keys = array_keys($ar);
   return array_keys($keys) !== $keys;
}

Ben geniş diziler üzerinde performansını hiç denemedim. Genellikle bir sorun değil yani çoğunlukla 10 veya daha az tuşları ile diziler üzerinde kullanabilirsiniz. Ben oluşturulan aralığı $ anahtarlarını karşılaştıran daha iyi bir performans olacaktır sanıyorum 0..count($array).

Arasında hiçbir fark yoktur

array('First', 'Second', 'Third');

ve

array(0 => 'First', 1 => 'Second', 2 => 'Third');

Eski sadece yerine bunları belirterek daha örtülü tuşları vardır

programmatically, you can't. I suppose the only way to check in a case like yours would be to do something like: foreach ($myarray as $key => $value) { if ( is_numeric($key) ) { echo "the array appears to use numeric (probably a case of the first)"; } }

ama bu dizi $ dizi = array (0 => "ilk", 1 => "ikinci", vb) olarak inşa edilmiş davayı tespit olmaz;

function is_assoc($array) {
    return (is_array($array) 
       && (0 !== count(array_diff_key($array, array_keys(array_keys($array)))) 
       || count($array)==0)); // empty array is also associative
}

burada bir başkasının

function is_assoc($array) {
    if ( is_array($array) && ! empty($array) ) {
        for ( $i = count($array) - 1; $i; $i-- ) {
            if ( ! array_key_exists($i, $array) ) { return true; }
        }
        return ! array_key_exists(0, $array);
    }
    return false;
}

Neşeyle PHP dokümantasyon sitesinde the is_array comments den sildi.

Yani bu form array('First', 'Second', 'Third'); örtülü PHP tuşları değerleri oluşturmak sağlar, özellikle de biraz zor bulunuyor.

Geçerli bir çözüm gibi bir şey giderdim sanırım:

function array_indexed( $array )
{
    $last_k = -1;

    foreach( $array as $k => $v )
    {
        if( $k != $last_k + 1 )
        {
            return false;
        }
        $last_k++;
    }

    return true;
}

Eğer> 5.1 php var ve sadece 0-tabanlı diziler arıyorsanız, size kod daraltabilir

$stringKeys = array_diff_key($a, array_values($a));
$isZeroBased = empty($stringKeys);

I Hope this will help you Jerome WAGNER