有条件地将静态关联元素添加到被推入二维数组的行

问题描述 投票:0回答:2

我想将可变大小的行添加到结果数组中,具体取决于数组中已有的其他值。

我的脚本:

$today = date("Ymd");
$finalDate = date('Ymd', strtotime('+2 days'));

foreach ($arr as $key => $value) {
    if ($value['DTSTART'] <= $finalDate){
        $values[] = array(
            'day' => $value['DTSTART'],
            'type' => $value['SUMMARY;LANGUAGE=en']
        );
    }
}

类型是这样的:不可回收废物、生物废物等。

我想根据废物类型向数组添加颜色。 我这样尝试过,但它添加了另一个“子数组”。

foreach ($arr as $key => $value) {
    if ($value['DTSTART'] <= $finalDate){
        $values[] = array(
            'day' => $value['DTSTART'],
            'type' => $value['SUMMARY;LANGUAGE=en']
        );
            
        switch ($value['SUMMARY;LANGUAGE=en']) {
            case "Non-recyclable waste":
                $values[] = array(
                    'color' => 'success'    
                );
                break;
            case "Bio-waste":
                $values[] = array(
                    'color' => 'success'    
                );
                break;
        }
    }
}

输入数组:

Array (
    [0] => Array (
        [DTSTART] => 20210712
        [DTEND] => 20210713
        [TRANSP] => TRANSPARENT
        [LOCATION;LANGUAGE=en] => streetname
        [UID] => uid
        [DTSTAMP] => 20210707T015623Z
        [DESCRIPTION;LANGUAGE=en] => description
        [SUMMARY;LANGUAGE=de] => Bio-waste
        [PRIORITY] => 9
        [CLASS] => PUBLIC [STATUS] => CONFIRMED
    )
    [1] => Array (
        [DTSTART] => 20210726
        [DTEND] => 20210727
        [TRANSP] => TRANSPARENT
        [LOCATION;LANGUAGE=en] => street
        [UID] => uid
        [DTSTAMP] => 20210707T015623Z
        [DESCRIPTION;LANGUAGE=en] => description
        [SUMMARY;LANGUAGE=en] => Non-recyclable waste
        [PRIORITY] => 9
        [CLASS] => PUBLIC
        [STATUS] => CONFIRMED
    )
)
php arrays multidimensional-array conditional-statements array-push
2个回答
1
投票

使用无条件数据(日期和类型)创建项目数组。根据需要添加条件数据(颜色)。将数组推送到主数组。

$values = [];

foreach ($arr as $key => $value)
{
    if ($value['DTSTART'] <= $finalDate)
    {
        $item = array(
            'day' => $value['DTSTART'],
            'type' => $value['SUMMARY;LANGUAGE=en'],
        );

        switch ($value['SUMMARY;LANGUAGE=en'])
        {
            case "Non-recyclable waste":
            case "Bio-waste":
                $item['color'] = 'success';
            break;
            // Add more cases.
        }
        
        $values[] = $item;
    }
}

0
投票

您可以展开有条件填充的数组,同时为每个推送行声明关联元素。

您当前的流程可以使用

in_array()
而不是
switch()
,但为了更好的可扩展性,也许
match()
是更好的现代技术。

代码:(演示

$arr = [
    ['DTSTART' => '2017-01-02', 'SUMMARY;LANGUAGE=en' => 'Non-recyclable waste'],
    ['DTSTART' => '2017-01-03', 'SUMMARY;LANGUAGE=en' => 'Bio-waste'],
    ['DTSTART' => '2017-01-04', 'SUMMARY;LANGUAGE=en' => 'Junk'],
];
$finalDate = '2038-12-31';

$result = [];
foreach ($arr as $value) {
    if ($value['DTSTART'] > $finalDate) {
        continue;
    }
    
    $result[] = [
        'day' => $value['DTSTART'],
        'type' => $value['SUMMARY;LANGUAGE=en'],
        ...match($value['SUMMARY;LANGUAGE=en']) {
            'Non-recyclable waste', 'Bio-waste' => ['color' => 'success'],
            default => []
        }
    ];
}
var_export($result);

输出:

array (
  0 => 
  array (
    'day' => '2017-01-02',
    'type' => 'Non-recyclable waste',
    'color' => 'success',
  ),
  1 => 
  array (
    'day' => '2017-01-03',
    'type' => 'Bio-waste',
    'color' => 'success',
  ),
  2 => 
  array (
    'day' => '2017-01-04',
    'type' => 'Junk',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.