array_reduce内部的条件

时间:2019-02-28 19:48:08

标签: php arrays key array-reduce

我想从以下数组中得出条件,但由于它没有运行第二个条件,因此无法给出预期的结果。

public static void ReadFile()
    {
        List<string> lines = new List<string>();
        using (var sr = new System.IO.StreamReader(@"C:\test\tempfile.txt"))
        {
            string line = null;
            while((line = sr.ReadLine()) != null)
            {
                lines.Insert(0, line);
            }
            lines.RemoveRange(0, 20);
        }
        List<string> result = lines.Where((x, i) => i % 2 == 0).ToList();
      //Results:
      // Fourth-Read:2019/09/24, 12345, abcdefg
      // Third-Read:2019/09/24, 12345, abcdefg
      // Second-Read:2019/09/24, 12345, abcdefg
      // First-Read:2019/09/24, 12345, abcdefg
    }

print_r($ total)输出以下内容:

$arr = [
        [ 
        472 => [ 
            'EL' => 52.9, 
            'MT' => 57.375, 
            'MO' => 56.6, 
            'SC' => 26, 
            'ET' => 50.775 
            ] 
        ], [ 
        505 => [ 
            'EL' => 53.425, 
            'MT' => 25, 
            'MO' => 62.8, 
            'SC' => 23, 
            'ET' => 25
            ] 
        ]                
    ];

$total = array_reduce(
   $arr,
   function($arr, $key) {
     $id = key($key);
     $consumed = $key[$id];
     $sc = array_keys($consumed);
     $arr[$id] = [
       "totalc" => array_sum($consumed),
       "condition" => array_search('SC', $sc) ? min($consumed) >= 23:26
     ];
     return $arr;
   },
   []
 );

我的预期输出如下:

Array
(
    [472] => Array
        (
            [totalc] => 243.65
            [condition] => 1
        )    
    [505] => Array
        (
            [totalc] => 189.225
            [condition] => 1
        )
    )

您可以清楚地看到我要检查:当它是'SC'时,我希望最小值为23。对于其他人,我希望最小值为26。所以我使用array_search()来扫描元素为“ SC”时的数组。不幸的是,它仅检查“ SC”,而不检查其他内容。请帮助我。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您希望“ SC”键的允许值最小为23(对于所有其余值为26)。

请注意,以下行:array_search('SC', $sc) ? min($consumed) >= 23:26首先检查“ SC”是否存在,并将整个数组的最小值设置为23或26。

如果您想根据按键设置不同的最小值,我建议这样做:

function checkMin($arr, $min, $exception) {
    foreach($arr as $k => $v) {
        if ($v < (isset($exception[$k]) ? $exception[$k] : $min)) 
            return false;
    }
    return true;
}

现在您可以拨打的电话是:

"condition" =>  checkMin($consumed, 26, ["SC" => 23])

希望有帮助!