【问题标题】:What is the equivalence to array some / every in php?在 php 中排列 some / every 的等价物是什么?
【发布时间】:2023-04-04 22:10:02
【问题描述】:

JavaScript 具有数组检查器函数 someevery 的概念,主要检查条件是否适用于数组的至少一个或所有元素。

function isBiggerThan10(element, index, array) {
  return element > 10;
}

[2, 5, 8, 1, 4].some(isBiggerThan10);  // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true

php有等效的方法吗?

【问题讨论】:

    标签: javascript php arrays functional-programming


    【解决方案1】:

    记住:编程不是魔法。不同的语言提供不同的原生特性/功能,但这并不总是意味着当您发现您的语言“缺少”某些东西时就会陷入困境。

    挑战自己去实现这些东西会很有趣也很有意义。

    function array_any(callable $f, array $xs) {
      foreach ($xs as $x)
        if (call_user_func($f, $x) === true)
          return true;
      return false; 
    }
    
    function array_all(callable $f, array $xs) {
      foreach ($xs as $x)
        if (call_user_func($f, $x) === false)
          return false;
      return true; 
    }
    

    现在您可以按预期使用它们了

    echo (int) array_any(function($x) { return $x > 5; }, [1,2,3]); // 0
    echo (int) array_any(function($x) { return $x > 5; }, [1,9,3]); // 1
    
    echo (int) array_all(function($x) { return $x > 5; }, [5,6,7]);  // 0
    echo (int) array_all(function($x) { return $x > 5; }, [6,7,8]);  // 1
    

    【讨论】:

    • 触摸。有时我认为语言的那些构建块是神奇的词,而不是我自己可以变出的东西。
    • 不应该是:call_user_func($f, $x)$f($x);
    • @k0pernikus 同意您的最后一条评论。在那里做了一个wups!
    • 非常好,因为它有早期救助并允许您提供谓词,但硬编码 === true=== false 阻止我投票。我更喜欢依赖更接近 some/all 语义的真值和假值。
    【解决方案2】:

    我没有找到这些收集功能的本地实现。那里有一些功能库,一个是支持someallphunctional,例如:

    use function Lambdish\Phunctional\some;
    
    return some(
        function ($number) {
            return $number > 10;
        }, 
        [1, 4, 3, 9, 5]
    );
    
    // false
    

    【讨论】:

      【解决方案3】:

      在 PHP 方法中 some 不存在,但你可以这样做:

      <?php
      function isSomeBiggerThan10($numbers){
          foreach($numbers as $num){
              if($num > 10)
                  return true;
          }
      
          return false;
      }
      
      isSomeBiggerThan10([2, 5, 8, 1, 4]); //false
      isSomeBiggerThan10([12, 5, 8, 1, 4]); //true
      

      【讨论】:

        【解决方案4】:

        你可以简单地这样做(如你的例子):

        function isBiggerThan10($value) {
          return $value >= 10;
        }
        echo array_filter([2, 5,8, 1, 4], "isBiggerThan10") ? 'yes' : 'no';  
        echo "<br>";
        echo array_filter([12, 5, 8, 1, 4], "isBiggerThan10") ? 'yes' : 'no';  
        

        【讨论】:

        • 这会访问每个元素。 some/any 语义具有提前救助功能,因此 array_filter 不合适。
        最近更新 更多