【问题标题】:How to get minimum positive value greater then 0 in php如何在php中获得大于0的最小正值
【发布时间】:2017-09-23 10:30:33
【问题描述】:

我想从数组中找到最小值,然后从所有元素中减去该值,直到所有元素都变为 0。问题是,如果数组包含一个元素为 0,那么它不会反映任何内容。提前致谢。

<?php

$handle = fopen ("php://stdin","r");
fscanf($handle,"%d",$n);
$arr_temp = fgets($handle);
$arr = explode(" ",$arr_temp);
array_walk($arr,'intval');

for($j=0;$j<10;$j++)
{
    $min = min($arr);
    for($i=0;$i<count($arr);$i++)
    {
        if($arr[$i]>=$min)
            $arr[$i]-=$min;
        echo $arr[$i]." ";
    }
    echo "\n";
}

?>

【问题讨论】:

  • 向我们展示您的代码
  • 忽略 0 个值? if($var === 0) 继续; ?
  • 如果你的最小值是负数而你减去负值怎么办?
  • 这可能是可能的,但现在我只关注正数

标签: php arrays function min


【解决方案1】:

使用array_filter(),加上一个函数,即使数组包含值为零的元素,也可以获得最小的非零正整数,如下:

<?php

$arr = array(0, 1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0);

function getMin( $a ) {
   $arr_filtered = array_values(array_filter( $a ));
   return min($arr_filtered);

}

$min = getMin( $arr );

$count = count($arr);

while( count( array_unique($arr) ) > 1 ) {


  for( $i = 0; $i < $count;  $i++)
  {
        if( $arr[$i] >= $min ){
            $arr[$i] -= $min;
            echo $arr[$i]." ";
        }
  }   
 echo "\n";
}

demo

注意,代码在 getMin() 中使用 array_values() 重新索引过滤后的数组。

只要最小值为 1,上述脚本就可以正常工作。但是,如果最小值是另一个数字,则需要调整代码。下面的脚本处理一个由四个数组组成的多维数组,每个数组都有不同的最小值,包括一个负值:

<?php
error_reporting(E_ALL);

$a = [   [0,1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0],
         [0, 2, 3, 4, 0, 5, 6, 4, 3, 2, 0],
         [0, 3, 4, 0, 5, 6, 7,8,4, 3, 0],
         [-1,0,1,2,3,4,2,1,0,-1]
     ];

function getMin( $a ) {

   return min($a);

}


foreach ($a as $arr) {
 while( ( $arr != null )  ) {
  $arr = array_values(array_filter($arr));
  if ($arr == null) {
    break;
  }
  $min = getMin( $arr );

  foreach ($arr as &$e)  {
            $e -= $min;
  }
  unset($e);
  echo join(" ",$arr),"\n";
 }
 echo "\n";
}

demo

注意,第二个脚本显式过滤掉每个数组中的零值,而第一个脚本有效这样做。两个脚本之间的主要区别在于 getMin() 需要在 while 循环中,以便在最小数字大于 1 或为负数时正确进行减法。

该脚本还以多种方式简化了代码。 while 循环的条件要简单得多——只要数组不为空就可以工作。代码不再需要 getCount() ,因为我将减法循环更改为使用带有随后未设置的引用变量的 foreach ——这对于避免问题很重要。这个 foreach 循环也不需要第一个脚本的 if 条件。

【讨论】:

    【解决方案2】:

    这是因为您每次都采用$min = min($arr); 值,它变成了 0,这就是您的代码无法正常工作的原因。 试试下面的代码

    $min = min($arr);
    for($j=0;$j<=100;$j++)
    {
    if (count(array_unique($arr)) === 1 && end($arr) === 0) {
    break;
    }
        for($i=0;$i<count($arr);$i++)
        {
            if($arr[$i] >= $min){
                $arr[$i]-=$min;
            echo $arr[$i]." ";
        }
        }   
     echo "<br>";
    }
    

    【讨论】:

      【解决方案3】:

      我对 php 了解不多,但在第一个 for 循环中,您应该检查数组的元素是否为零或不使用 if 语句,例如 if(arr[j]!=0)

      for($j=0;$j<10;$j++)
      {
          if($arr[$j]!=$0)
          $min = min($arr);
          for($i=0;$i<count($arr);$i++)
          {
              if($arr[$i]>=$min)
                  $arr[$i]-=$min;
              echo $arr[$i]." ";
          }
          echo "\n";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-16
        • 2012-04-10
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        相关资源
        最近更新 更多