Düzgün bir dizi düzeylerinin miktarını hesaplamak nasıl?

3 Cevap php

Ben puanlık bir dizi ya da puan dizinin bir dizi (2 ya da 3 boyutlu bir dizi) kabul etmek olan bir işlevi var. Ben 2 veya 3 düzeyleri olup olmadığını tespit etmek için bir güvenilir yol arıyorum. Şey kontrolünü yapmak için dizilerin tuşları saymak olamaz, bu nedenle bu wont çalışır:

$levels = isset($array[0][0]) && is_array($array[0][0]) ? 3 : 2;

.. Ilk anahtar 0 olmayabilir gibi. Genellikle, ama bu güvenmek istemiyorum. Ve neyse, bir berbat ve bunu yakın bir fikirli bir yoldur. Optimal, I düzeylerinin without tüm dizi döngü zorunda herhangi bir sayı için kontrol etmek istiyorum.

İşte diziler gibi görünebilir ne:

array(5) {
    [2] => array(2) {
        [x] => 3
        [y] => 6
    }
    [3] => array(2) {
        [x] => 4
        [y] => 8
    }
    ...

Ve üç boyutlu bir dizi bu dizileri içerecektir.

Bazı notlar:

  • Diziler büyük, bu yüzden tamamen diziler döngü çok iyi bir seçenek değildir
  • Diziler sayısal ve sırayla (x ve y olan son düzeyi istisna ile) endeksli
  • Dizi anahtarları olabilir veya 0'dan başlangıç ​​olabilir

Bunu yazarken, ben mümkün olabilecek bir çözüm ile geldi; Bu ise bir dizinin ilk öğe denetleyen bir özyinelemeli işlev, sonra vb yeni bulunan dizide kendisini aramak

Daha iyi, daha temiz fikirler var mı? Hem skalar değerler ve diziler olabilir dizileri desteklemek için bonus puan (örneğin bir dizinin ilk öğe bir dize olabilir, ancak sonraki bir dizidir).

3 Cevap

Tam bir dizi veya diziler tam bir dizi bekliyoruz o zaman deneyebilirsiniz: -

if (isset $points[0][0][0])

If however your array is sparse its more difficult. The basic problem is that a php "array" is actually a one dimensional hash. The trick being that a value can be another "array". So you need to access to second level to determine whether its a value or an array.

Belirli bir dizi tek nokta değerleri veya yalnızca başka diziler içerir beklemek durumunda tekrar sadece bir girdi böylece kontrol etmeniz gerekir:

if ( is_array(current(current($points))) )

Ne istediğinizi almalısınız: current() function geçerli dizi işaretçi döndürür (ilk varsayılan - bu yüzden her zaman bir şey kurulacaktır), böylece iç akım ($ puan) size $ alacağı noktalar [0] veya dışında akım likwise bir gerçek değer ile ilk giriş size $ noktaları gibi bir şey elde edeceksiniz [0] [0].

Ben en azından dizi yineleme olmadan bunu nasıl görmüyorum. Basit gerçek dizideki elemanların herhangi bir ek bir düzeyde olmasıdır. Bunun bir sonucu olarak, her bir öğe test edilmesi gerekmektedir.

Söyleniyor, yine kod biraz geliştirmek için özyineleme kullanabilirsiniz:

/** 
 * Determine the maximum depth of an array.
 * @param $input The object to test. Might be an array, or might be an int (or
 *        any other object).
 * @param $startDepth The starting depth. Will be added as an offset to the
 *        result.
 * @return The depth of the array, plus any initial offset specified in
 *         $startDepth.
 */
function testDepth($input, $startDepth = 0) {
    if (is_array($input) {
        $max = $startDepth;
        for ($array as $i) {
            // Check what the depth of the given element is
            $result = testDepth($i, $startDepth + 1);
            // We only care about the maximum value
            if ($result > $max) {
                $max = $result;
            }
        }
        return $max;
    } else {
        // This isn't an array, so it's assumed not to be a container.
        // This doesn't add any depth to the parent array, so just return $startDepth
        return $startDepth;
    }
}

testDepth($array);

$ Seviyeleri = is_array (akımı (($ dizi)))? 3: 2;