2010-02-03 18 views
11

Çok boyutlu bir dizide belirli bir tuş için maksimum değeri seçmeye çalışıyorum. Ben ... Söz konusu anahtar "almak" sorun yaşıyorumÇok boyutlu bir dizideki bir öğeden maksimum değeri alın.

Yani, çalışıyorum

[0] => stdClass Object 
    (
     [id] => 70 
     [cust] => 4 
     [dnum] => 1 
     [upper] => Array 
      (
       [0] => 66 
      ) 

    ) 
[1] => stdClass Object 
    (
     [id] => 43 
     [cust] => 42 
     [dnum] => 2 
     [upper] => Array 
      (
       [0] => 77 
      ) 

    ) 
[2] => stdClass Object 
    (
     [id] => 12 
     [cust] => 3 
     [dnum] => 0 
     [upper] => Array 
      (
       [0] => 99 
      ) 

    ) 

(çok daha uzun Burada post ediyorum olandan ise) dizi tüm dizi boyunca maksimum "dnum" değerini bulmak, bu nedenle, bu örnekte, $ max = 2. Maksimum fonksiyonun bunu yapmamı sağladığını biliyorum, ama bütününü koymadan dnum öğesine nasıl referans vereceğimi bilmiyorum bir foreach döngüsündeki şey, ve eğer bunu yaparsam, o zaman max kullanmak için fonksiyon olmazdı, değil mi?

Yani, tam olarak bunu yapamaz: dizinin tamamı yeniden oluşturmak zorunda kalmadan bunu yapmak benim için bir yol

$max = max($myarray[]->dnum); 

var mı?

+0

@Felix Kling: NEDEN böyle bir __MINOR__ düzenleme yapmak ve bu soruyu yeniden etkinleştirmek ki? –

+0

@Pranav: Temizleme ... etiketleri başlığa ait değil. –

cevap

10
$max = 0; 
foreach($array as $obj) 
{ 
    if($obj->dnum > $max) 
    { 
     $max = $obj->dnum; 
    } 
} 

en yüksek sayı negatif değilse bu işlev düzgün çalışacak (negatifleri, boş diziler ve 0'lar 0 olarak max dönecektir).

Özel özellikleri/yapıları olan bir nesne kullandığınız için, gerçekten almak için kullanabileceğiniz önceden tanımlanmış herhangi bir işlev olduğuna inanmıyorum. Sadece bir foreach döngü kullanın.

İç işlevler bile bir foreach döngüsünü kullandığından, gerçekten bir sahne döngüsünden uzaklaşamazsınız, bu yalnızca sahne arkasındadır.

başka çözüm, PHP 5.2

$numbers = array(); 
foreach($array as $obj) 
{ 
    $numbers[] = $obj->dnum; 
} 
$max = max($numbers); 
21

bu dizinin döngü için yapılacak tek yoldur.

$max = null; 
foreach ($arr as $item) { 
    $max = $max === null ? $item->dnum : max($max, $item->dnum); 
} 

Not: tüm dnum değerleri negatif ise o zaman şimdi kabul edilmiş bir çözüm hatalı bir sonuç üretecektir çünkü 0 ile sonuca ekildi ettik. Max'i mantıklı bir şeyle tohumlamalısın.

Alternatif array_reduce() kullanabilirsiniz:

$max = array_reduce($arr, 'max_dnum', -9999999); 

function max_denum($v, $w) { 
    return max($v, $w->dnum); 
} 
anonim işlevini kullanabilirsiniz 5.3+ PHP

:

$max = array_reduce($arr, function($v, $w) { 
    return max($v, $w->dnum); 
}, -9999999); 

Sen de array_map() kullanabilirsiniz:

function get_dnum($a) { 
    return $a->dnum; 
} 

$max = max(array_map('get_dnum', $arr)); 
+0

Size ve alternatif snytaxes kullanımınıza lanet olsun! (şaka yapıyor) –

+0

+1 'max()' :) 'yı kullanmak için nadiren herhangi bir oyun zamanı olsun. – Sampson

+1

Farklı seçenekler için teşekkürler! Ben array_map'ın argümanlarını başka bir şekilde ele aldığına inanıyorum (ilgili doc) (http://php.net/manual/en/function.array-map.php)) böylece en son çözüm $ max = max olmalıdır. (array_map ('get_dnum', $ arr)); – Robin

4

en basit yol muhtemelen ilk düşüncenizdir.

$out = array(); 
foreach($myarray as $obj) { 
    $out[] = $obj->dnum; 
} 
echo max($out); 

ayrı bir dizi yaratmadan yapabileceğini, ancak çok daha sık max() arayarak son edeceğiz: ve sonra bu konuda max() diyoruz, ayrı bir diziye bütün dnum anahtarları çekin.Performans/bellek kullanımı, ikisi arasında farklı olacaktır Eğer kriter hep olabilir o:

$first = $myarray[0]; //assume zero start index 
$max = $first->dnum; 
foreach($myarray as $obj) { 
    $max = max($max,$obj->dnum); 
} 
echo $max; 

Eğer usort() kullanarak diziyi sıralamak olurdu bu konuda gidebiliriz diğer tek yolu ve nesnenin dayalı bir özel sıralama işlevi dnum özellikleri. Bu muhtemelen dizininizi döngülemekten çok daha yavaş olacak, bu yüzden dizinin bir yan etki olarak sıralanması gerekmedikçe tavsiye ederim.

+0

Vay, yumruk için ciddi bir şekilde dövdü. Yazmak için daha az zaman harcamam gerek. : D – zombat

+0

+1 Duyguları biliyorum :) – Sampson

3

Eğer oneliners

isterseniz
$max = max(array_map(function($row){ return $row->dnum; }, $myarray)); 
İlgili konular