【问题标题】:Get array with results of object method on each item in an array of objects in PHP在PHP中的对象数组中的每个项目上获取带有对象方法结果的数组
【发布时间】:2009-12-02 21:02:47
【问题描述】:

我有一个对象数组,我想将其转换为每个对象的方法结果的数组。我可以做到这一点,但我想知道是否有更清洁/更好的方法呢?例如,假设这是我正在使用的内容以及我现在的操作方式:

$objects = array();

$objects[] = new Dog();
$objects[] = new Dog();
$objects[] = new Dog();

$data = array();
foreach ($objects as $obj) {
  $data[] = $obj->myMethod();
}

显然这不是很重要,但如果知道将来有更好的方法从$objects 生成$data,那就太好了。有任何想法吗?我在想有一些功能可以解决这个问题,比如array_map() 之类的,但我没有找到。

【问题讨论】:

    标签: php


    【解决方案1】:

    你确实可以使用 PHP 的 array_map() 来做到这一点

    function cb($obj) { return $obj->myMethod(); }
    .
    .
    $data = array_map(cb, $objects);
    

    【讨论】:

    • 在 php 5.3 中你可以使用匿名函数而不是 function cb($obj)
    • 啊是的 5.3 - 在 Windows 7 上我无法在 CLI 模式下正常运行的版本 :( - 但确实这是一个更好的方法......
    • 这看起来确实是最好的方法 - 谢谢。是的,我也喜欢 5.3 版本,但在本地或正在前往的服务器上没有它。
    【解决方案2】:

    如果你有 php 5.3 或更高版本,更简洁的方法是将 array_map() 与匿名函数一起使用:

    $retArray = array_map(function($o){ $o->myMethod(); }, $myArray);
    

    如果您没有 php 5.3,则必须事先声明函数并将函数名称传递给 array_map()

    【讨论】:

      【解决方案3】:

      您可以使用更多的 OOP:ish 方法来使用迭代器。

      class TrainedDogIterator implements Iterator {
          // implement methods on http://php.net/iterator
          public function current() {
              $dog = current($this->dogs); // $this->dogs would be your objects
              $trained_dog = $this->_trainDog($dog);
              return $trained_dog;
          }
          private function _trainDog($dog) {
              // do something with dog
              return $dog;
          }
      }
      

      在您的示例中使用 $data 的地方使用它。

      $di = new TrainedDogIterator($dogs);
      foreach($di as $dog) {
          // $dog is trained
      }
      

      【讨论】:

      • 这是解决问题的好/不同的方法,所以谢谢 - 也可以在其他事情上派上用场。在这种情况下,我使用了一个重用的函数,它返回对象数组,在其他情况下需要保持原样。不过,实现这种方法可能会将功能放在代码中更合适的位置。
      • @pssdbt: 代码有点长,很高兴你喜欢它 :) 如果你提供更大的系统图像,你会得到更多关于整体设计的反馈,但我同意在这种情况下,您将正确答案标记为正确。
      【解决方案4】:

      TMTOWTDI, array_walkarray_map 的工作方式类似,但会就地修改数组。虽然array_map有支持多数组的优势:

      http://us3.php.net/array_walk

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-14
        • 2018-10-15
        • 2018-06-28
        • 1970-01-01
        • 2017-11-25
        • 2022-10-25
        • 2011-09-04
        • 1970-01-01
        相关资源
        最近更新 更多