Php 将列值收集到数组中

Php 将列值收集到数组中,php,Php,我在开发时经常遇到的模式之一是尝试将一个列/属性值从一个对象集合收集到一个数组中。例如: $ids = array(); foreach ($documents as $document) { $ids[] = $document->name; } 我是唯一一个碰到这件事的人吗?PHP有没有办法用更少的行来解决这个问题?我找了,但什么也没找到 因为我使用了MVC框架,所以我可以访问一个BaseUtil类,该类包含一些不适合任何特定类的常用函数。同事提出的一个解决方案是: cla

我在开发时经常遇到的模式之一是尝试将一个列/属性值从一个对象集合收集到一个数组中。例如:

$ids = array();
foreach ($documents as $document) {
    $ids[] =  $document->name;
}
我是唯一一个碰到这件事的人吗?PHP有没有办法用更少的行来解决这个问题?我找了,但什么也没找到

因为我使用了MVC框架,所以我可以访问一个BaseUtil类,该类包含一些不适合任何特定类的常用函数。同事提出的一个解决方案是:

class BaseUtil
{
    public static function collect($collection, $property) {
        $values = array();
        foreach ($collection as $item) {
            $values[] = $item->{$property};
        }
        return $values;
    }
}
然后我可以做:

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

不太破旧。还有人有其他想法吗?我疯了吗?或者这似乎是PHP很久以前就应该解决的问题吗?

另一种方法是使用“富”数组对象,就像其他语言中的数组对象一样

比如说

    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();

PHP作为一种语言的弱点之一是它的表达能力不强

在Ruby或Perl等语言中,您可能只需一行代码就可以获得这些数据,通常需要像您发布的那样的小型算法来获得所需的结果

我会坚持你所拥有的,但这里有另一种方法,只是为了见鬼

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};
    }
}

谢谢大家的意见。我想我要用我同事的解决方案:

class BaseUtil
{
    public static function collect($collection, $property) {
        $values = array();
        foreach ($collection as $item) {
            $values[] = $item->{$property};
        }
        return $values;
    }
}
您可以为此目的使用函数:

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

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

您也可以考虑lambda函数的函数,如果您不想在全局命名空间中创建GETNAMEY()函数。< /P> 在PHP 5.3中,您甚至可以执行以下操作:

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

加载Magento集合,然后在该集合中再次循环,以便可以将所需的值添加到数组中,这是无效的。适当的方法是使用getColumnValues()方法。此方法将通过指定列名为您提供一个值数组

以下是正确的方法

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

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

这将为您提供一个包含您选择的所有客户id值的数组。

您可以使用

或使用阵列(来自ouzo goodies)

您甚至可以提取方法调用或数组访问等的嵌套字段:

$names = Arrays::map($documents, Functions::extract()->getAuthor()->roles[0]);
退房:


另请参见使用ouzo的函数式编程(我无法发布链接)。

这对我来说不起作用,因为我想将其推广到任何属性/属性;不仅仅是名字。当尝试这样做时,数组\u map()变得更加混乱,我无法让它工作。@JustinValentini它不需要混乱:
$name=“foobar”;数组映射(函数($obj)使用($name){return$obj->{$name};},$documents)
另外,使用
create_函数
是个坏主意。没有人再使用PHP5.2了——如果他们使用,那将是一个严重的安全问题。使用闭包代替。在PHP中不需要将类作为引用传递,它们是默认的。
$names = Arrays::map($documents, Functions::extract()->name);
$names = Arrays::map($documents, Functions::extract()->getAuthor()->roles[0]);