【问题标题】:return result of foreach loop(s)foreach 循环的返回结果
【发布时间】:2017-03-10 04:23:35
【问题描述】:

我有一些看起来像这样的代码(我已经简化了):

function process_something($a){
    foreach($a as $b){
        // Some logic here
        return $something;
    }
}
$input=[]; // An array of some kind
echo process_something($input);

我希望最后一行能回显循环返回的内容,但我什么也没得到。也许上面的代码不起作用。我只是为了说明而把它放进去。我有很多嵌套循环一起工作以返回各种东西。

如果我有循环回显数据,它就可以工作。但是,我需要这个函数只是将最终结果返回给我以进行进一步处理,而不是回显给用户。

我该怎么做?

【问题讨论】:

  • 调用return时,函数结束……这就是return的本质
  • 你知道这个循环只会执行一次吗?在第一个循环中,他将从函数中获得返回。
  • 你能发布实际的例子吗?更容易理解您想要实现的目标。

标签: php foreach return


【解决方案1】:
class StrHelper
{
    /**
     * Check for $string starts with $query
     * @param $string
     * @param $query
     * @return bool
     */
    public static function startsWith($string,$query){
        return substr($string, 0, strlen($query)) === $query;
    }
}

class ModelSearchHelper
{
    /**
     * filter  where $key of $data arr startsWith $modelName
     * @param string $modelName
     * @param array $data
     * @return array
     */
    public static function searchFor(string $modelName,array $data){
// this code do same
//        $out=[];
//        foreach ($data as $key=>$value){
//          if(StrHelper::startsWith($key,$modelName)){
//                $out[$key]=$value;
//            }
//        }
//        return $out;
// of this
        return array_filter($data,function ($value,$key) use ($modelName){
            return StrHelper::startsWith($key,$modelName);
        },ARRAY_FILTER_USE_BOTH );
    }
}

$test=[
    'limit'=>10,
    'offset'=>5,
    'customer.name'=>'Fox',
    'customer.address.street'=>'forest st.'
];


//filter where $key of $model startsWith $modelName
var_dump(ModelSearchHelper::searchFor('customer',$test));

结果:

array(2) {
  ["customer.name"]=>
  string(3) "Fox"
  ["customer.address.street"]=>
  string(10) "forest st."
}

【讨论】:

    【解决方案2】:

    在这种情况下,这个循环只会运行一次,因为return 在第一次出现时会跳出函数。

    应该更像:

    function process_something($a){
        foreach($a as $b){
            $something = 'Some math or other logic here';
        }
        return $something;
    }
    $input=[]; // An array of some kind
    echo process_something($input);
    

    请发布您的代码,我们将尝试找出问题所在。

    【讨论】:

    • 好的,这就为我解答。我不需要发布代码,因为它变得非常复杂。为了保持代码的可读性(它是巨大的!),我想将它保留为一系列循环和函数(返回数据),但这可能会起作用。或者,也许我可以获取函数来更新存储在循环之外的另一个变量。
    • 感谢@Karol 的回答,我在尝试返回循环的所有结果时遇到了同样的问题。现在我知道 return 必须在循环之外,否则它会在第一次出现时跳出。
    【解决方案3】:

    这是 generator 的完美案例,这是我很少看到使用的概念。

      function process_something($a){
        foreach($a as $b){
          // Some logic here
          yield $something;
        }
      }
    
      $input=[]; // An array of some kind
    
      /**
       * The generator returns an Iterator instance
       * so you'd need to loop over it
       */
      foreach(process_something($input) as $item){
        // do stuff here
        // echo $item
        // echo $item->something
        // your call
      }
    

    这里的主要优势是您可以“在没有实际返回的情况下返回”,您正在产生一个值,并且生成器继续它的工作。

    更不用说它的内存效率很高,至少 99% 的时间内存都不是问题。

    并且,这是很好的部分,您可以为$input 中的每个项目应用特定的逻辑,而无需执行一些奇怪的hack-ish 功能。


    替代品

      function process_something($a){
        $return = [];
    
        foreach($a as $b){
          // Some logic here
          $return[] = $something;
        }
    
        return $return;
      }
    

    这个答案不是评论的唯一原因是我很少看到一个可以合法地从生成器中受益的问题。这是其中之一。


    关于生成器的更多信息:

    http://blog.ircmaxell.com/2012/07/what-generators-can-do-for-you.html

    https://scotch.io/tutorials/understanding-php-generators

    【讨论】:

    • 虽然 Karol 为我解决了这个问题,但我认为这是一个很好的答案,我需要研究一下,因为我根本不知道 yield
    • 这是相当新的,因为 PHP 5.6(我认为),它只对 PHP 来说是新的,其他编程语言定期使用生成器,我们只是跟随他们的脚步:D
    • 老实说,要使用它,我将不得不更改部分代码。目前,我已经接受了 Karol 的回答,因为它使我的项目取得了进展,但是一旦我需要清理所有内容,将来使用这种方法是值得的。这是我希望在开始之前就知道的方法!
    【解决方案4】:

    我确实得到了你。但我认为您正在寻找数组的最后一个值。 要做到这一点,就这样做:

    function process_something($a){
       $b = array_reverse ($a);
       return $b[0];
    }
    

    【讨论】:

    • 不,不是这样,但感谢array_reverse 的提醒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2014-10-26
    • 2013-12-15
    • 2014-05-27
    • 2020-05-06
    • 2015-07-23
    • 2021-12-08
    相关资源
    最近更新 更多