Bir diziye sütun değerleri Toplama

5 Cevap

Geliştirirken sık sık rastlamak desen biri bir diziye nesneler koleksiyonundan bir sütun / öznitelik değeri toplamaya çalışıyor. Örneğin:

$ids = array();
foreach ($documents as $document) {
    $ids[] =  $document->name;
}

Ben bu işe çalışır tek ben miyim? Ve PHP az hatları bu çözmek için bir yol var mı? Ben baktım ama bir şey buldum.

MVC framework kullanmak beri ben gerçekten belirli sınıflara sığmayan ortak fonksiyonları içeren bir BaseUtil sınıfa erişebilirsiniz. Bir işçi tarafından önerilen tek çözüm:

class BaseUtil
{
    public static function collect($collection, $property) {
        $values = array();
        foreach ($collection as $item) {
            $values[] = $item->{$property};
        }
        return $values;
    }
}

Sonra ben sadece yapabilirsiniz:

$ids = BaseUtil::collect($documents, 'name');

Fena değil. Başkasının başka fikirleri var? Ve ben deliyim ya da bu PHP uzun zaman önce çözülmüş olması gereken bir sorun gibi görünüyor?

5 Cevap

Bu amaç için array_map() işlevini kullanabilirsiniz:

function getName($obj) {
    return $obj->name;
}

$documentsName = array_map("getName", $documents);

Eğer genel ad bir getName() işlevi oluşturmak istemiyorsanız da lambda fonksiyonları için create_function() fonksiyonunu düşünebilirsiniz.

PHP 5.3 bile yapabilir In:

$documentsName = array_map(function ($obj) { return $obj->name; }, $documents);

Giriş çocuklar için teşekkür ederiz. Ben sadece benim iş arkadaşının çözümü kullanmak için gidiyorum sanırım:

class BaseUtil
{
    public static function collect($collection, $property) {
        $values = array();
        foreach ($collection as $item) {
            $values[] = $item->{$property};
        }
        return $values;
    }
}

Bir Magento koleksiyon yüklüyor ve bunu etkisiz olduğunu bir diziye istenen değerleri ekleyebilirsiniz, böylece koleksiyonunda tekrar döngü daha. Bunu yapmak için uygun bir yol getColumnValues ​​() yöntemi kullanıyor. Bu yöntem, sütun adını belirterek size değerler dizisi verecektir.

İşte bunu yapmanın uygun yoldur.

$collection =Mage::getModel('your/object')->getCollection()
                        ->addFieldToSelect('customer_id');

$yourArray = $collection->getColumnValues('customer_id');

Bu size seçtiğiniz tüm customer_id değerleri ile bir dizi verecektir.

Başka bir yaklaşım, diğer dillerde bulunanlar gibi "zengin" Dizi nesneleri kullanmaktır

örneğin

	class Ary extends ArrayObject
	{
	    function pluck($key) {
	       $a = array();
	       foreach($this as $sub) $a[] = $sub[$key];
	       return new self($a);
	    }

	    function join($delim = ',') {
	        return implode($delim, (array) $this);
	    }

	    static function init($ary) {
	       return new self($ary);
	    }
	}

	echo
	  Ary::init(array(
	     array('foo', 'bar'), array('baz', 'quux')
	  ))->pluck(1)->join();

Bir dil olarak PHP'nin zaaflarından biri o korkunç etkileyici değil olmasıdır.

Ruby veya Perl gibi dillerde muhtemelen tek bir kod satırı ile bu verileri alabilir nerede, genellikle istenen sonuçları almak için gönderilen biri gibi küçük algoritmalar gerekiyor.

Ben ne var sopa istiyorum, ama burada sadece bunu halt için başka bir yaklaşım.

class BaseUtil
{
    public static function collect($collection, $property)
    {
      array_walk( $collection, array( __CLASS__, 'reduceObject' ), $property );
      return $collection;
    }

    public static function reduceObject( &$object, $index, $property )
    {
      $object = $object->{$property};
    }
}