
[code]

    $arr = ['foo' => 10, 'bar' => 11, 'bazz' => 3, 'fizz' => 8];
    
[/code]

といった連想配列で次の要素の値と比較して小さければfalseを返したいです


CC BY-SA 3.0
2018-02-15T19:08:39.947
41751
2018-06-29T08:51:05.193
2018-02-16T01:02:39.993
3060
27419
question
php
連想配列で次の要素の値と比較


Here you are.  
`bool is_stairs(array $arg)`

[code]

    <?php
    function get_numeric($value)
    {
        if (!is_numeric($value)) {
            throw new InvalidArgumentException();
        }
        return $value + 0;
    }
    
    function is_stairs(array $arg)
    {
        if (!$arg) {
            return false;
        }
        $stack = array_values($arg);
        $previ = array_shift($stack);
        $previ = get_numeric($previ);
        foreach ($stack as $value) {
            $value = get_numeric($value);
            if ($value < $previ) {
                return false;
            }
            $previ = $value;
        }
        return true;
    }
    
[/code]

普通の配列にも対応してます。  
空配列では `false` が返り、1要素では `true` が返ります。  
同じ値が続いた場合でも `false` は返りません。  
値に `is_numeric` が `false` を返す要素が含まれていた場合 `InvalidArgumentException` が発行されます。  
確かめていませんが、たぶん浮動小数点数でも動作します。

[code]

    <?php
    // 空配列: bool(false)
    var_dump(is_stairs([]));
    
    // １要素: bool(true)
    var_dump(is_stairs([7]));
    
    // bool(true)
    var_dump(is_stairs([7, 42]));
    
    // 例: bool(false)
    $arr = ['foo' => 10, 'bar' => 11, 'bazz' => 3, 'fizz' => 8];
    var_dump(is_stairs($arr));
    
    // bool(true)
    $arr = ['foo' => 0, 'bar' => 1, 'bazz' => 3, 'fizz' => 8];
    var_dump(is_stairs($arr));
    
    // bool(true)
    $arr = ['foo' => 10, 'bar' => 11, 'bazz' => 13, 'fizz' => 18];
    var_dump(is_stairs($arr));
    
    // bool(true)
    $arr = ['foo' => -INF, 'bar' => -11, 'bazz' => 3, 'fizz' => 8];
    var_dump(is_stairs($arr));
    
[/code]


CC BY-SA 4.0
2018-06-29T08:40:37.047
45162
2018-06-29T08:46:39.343
2018-06-29T08:46:39.343
28832
28832
41751
answer

[code]

    <?php
    $arr = ['foo' => 10, 'bar' => 11, 'bazz' => 3, 'fizz' => 8];
    //添え字一覧を取得
    $keys=array_keys($arr);
    //現在の添え字の順番でループ
    for($n=0,$l=count($keys);($n+1)<$l;$n++){
        //次の添え字と比較し小さければ
        if($arr[$keys[$n]]<$arr[$keys[$n+1]]){
            //false表示
            echo "{$keys[$n]} < {$keys[$n+1]} : is false".nl2br(PHP_EOL);
        }
    }
    
[/code]


CC BY-SA 4.0
2018-06-29T08:51:05.193
45163
2018-06-29T08:51:05.193
41751
answer