Çok boyutlu bir dizideki bir elemanın gelen maksimum değeri elde?

3 Cevap php

Ben çok boyutlu bir dizi belirli bir anahtar için maksimum değerini seçmek için çalışıyorum. Ben söz konusu anahtar "alma" sorun yaşıyorum ...

Yani, (Ben burada ilanıyla ettiğimi çok daha uzundur) dizi

[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
            )

    )

Bu örnekte, $ max = 2. Ben max işlevi bana bunu sağlar biliyorum ben, tüm dizi boyunca maksimum "dnum" değerini bulmak için çalışıyorum, ama ben dnum başvuru nasıl emin değilim Bir foreach döngüsü içinde her şey koyarak ve bunu yaparsam, o zaman max doğru kullanmak işlevi olmaz olmadan eleman?

Yani, tam olarak bunu yapamam:

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

Bana tüm dizi yeniden zorunda kalmadan bunu yapmak için bir yolu var mı?

3 Cevap

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

En yüksek sayı negatif ise bu işlev düzgün çalışmaz olur.

Özel özellikleri / yapılara sahip bir nesneyi kullanıyorsanız, çünkü, ben bunu almak için kullanabileceğiniz herhangi bir 'önceden' işlevleri gerçekten var inanmıyorum. De sadece bir foreach döngüsü kullanabilirsiniz.

Hatta iç fonksiyonları foreach döngüsü kullanmak gibi gerçekten uzak bir foreach döngü elde edemez, sadece perde arkasında.

Başka bir çözüm

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

PHP 5.2 bunu yapmanın tek yolu dizi döngü olduğunu.

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

Tüm dnum değerleri negatif ise o artık kabul edilen bir çözüm, hatalı bir sonuç üretecektir çünkü Note: Ben 0 ile sonuç seribaşı ettik. Eğer mantıklı bir şey ile max tohum gerekir.

Alternatif Kullanmak array_reduce() olabilir:

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

function max_denum($v, $w) {
  return max($v, $w->dnum);
}

PHP 5.3 + bir anonim işlevini kullanabilirsiniz:

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

Siz de array_map() kullanabilirsiniz:

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

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

Basit yolu bir kez döngü sizin dizi için olan, muhtemelen ilk düşünce, ve sonra max() Bu çağrıda, ayrı bir diziye tüm dnum tuşları çekin:

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

Ayrı bir dizi oluşturma olmadan bunu yapabilirdi, ama max() çok daha sık arayarak bitireceğiz. Performans / bellek kullanımı olabilir, her zaman kriter bu, ikisi arasında farklı olacaktır:

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

Bu konuda gidebiliriz diğer tek yolu usort() ve nesne dnum özelliklerine göre özel bir sıralama işlevi kullanarak diziyi sıralamak olacaktır. Bu muhtemelen sadece Ancak diziyi döngü daha yavaş olacak, bu yüzden bir yan etkisi olarak sınıflandırılmaktadır dizi gerekli olmadıkça bunu tavsiye ederim sanmıyorum.