递归数组更改键案例不满足大写

时间:2018-04-24 04:12:41

标签: php phpunit

我已经创建了一个自定义函数来处理递归更改数组键的情况。

以下是类中的静态常量:

/**
 * KEY_CASE_UPPER is used with
 * array_change_key_case and is used to convert array
 * keys to upper case.
 */
const KEY_CASE_UPPER = 1;

/**
 * KEY_CASE_LOWER is used with
 * array_change_key_case and is used to convert array
 * keys to lower case.
 */
const KEY_CASE_LOWER = 0;

以下是方法:

public static function arrayChangeKeyCaseRecursive(array $array,int $case=null):array
{
    $ret=[];
    foreach($array as $k=>$v){
        if(is_array($v)){
            if($case===static::KEY_CASE_LOWER){
                if(is_string($k)){
                   $ret[strtolower($k)]=static::arrayChangeKeyCaseRecursive($v,$case);
                } else {
                   $ret[$k]=static::arrayChangeKeyCaseRecursive($v,$case);
                }
            } else {
                if(is_string($k)){
                    $ret[strtoupper($k)]=$v;
                } else {
                    $ret[$k]=$v;
                }
            }
        } elseif(is_string($k)) {
            if($case===static::KEY_CASE_LOWER){
                $ret[strtolower($k)]=$v;
            } else {
                $ret[strtoupper($k)]=$v;
            }
        } else {
            $ret[$k]=$v;
        }
    }
    return $ret;
}

出于某种原因,它适用于lowercase,但不适用于uppercase

以下是单元测试:

public function testArrayChangeKeyCaseRecursiveSatisfiesLowerCase()
{
    $data=[
      0=>['FOO'=>0,'BAR'=>1,'BAZ'=>2],
      1=>['SUM'=>0,'WORLD'=>1,'DAT'=>2],
      2=>['ADD'=>0,'DIVIDE'=>1,'MULTIPLY'=>2]
    ];
    $expected=[
        0=>['foo'=>0,'bar'=>1,'baz'=>2],
        1=>['sum'=>0,'world'=>1,'dat'=>2],
        2=>['add'=>0,'divide'=>1,'multiply'=>2]
    ];
    $actual = PhpArray::arrayChangeKeyCaseRecursive($data,PhpArray::KEY_CASE_LOWER);
    $this->assertEquals($expected,$actual);
}

public function testArrayChangeKeyCaseRecursiveSatisfiesUpperCase()
{
    $data=[
        0=>['foo'=>0,'bar'=>1,'baz'=>2],
        1=>['sum'=>0,'world'=>1,'dat'=>2],
        2=>['add'=>0,'divide'=>1,'multiply'=>2]
    ];
    $expected=[
        0=>['FOO'=>0,'BAR'=>1,'BAZ'=>2],
        1=>['SUM'=>0,'WORLD'=>1,'DAT'=>2],
        2=>['ADD'=>0,'DIVIDE'=>1,'MULTIPLY'=>2]
    ];
    $actual = PhpArray::arrayChangeKeyCaseRecursive($data,PhpArray::KEY_CASE_UPPER);
    $this->assertEquals($expected,$actual);
}

我似乎无法弄明白。任何帮助,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

我认为您的功能可以大大简化:

final static String SCOPES[] =  { 
    "https://graph.microsoft.com/User.Read", 
    "Calendars.ReadWrite", 
    "Calendars.Read",
    "Calendars.Read.Shared",
    "Calendars.ReadWrite.Shared"
    };
final static String CALENDER_URL =
    "https://graph.microsoft.com/v1.0/me/events?$select=subject,body,bodyPreview,organizer,attendees,start,end,location";

答案 1 :(得分:0)

试一试:

public static function arrayChangeKeyCaseRecursive(array $array,int $case=null):array
{

    $ret=[];
    foreach($array as $k=>$v)
    {
        if(is_array($v))
        {
            if($case === static::KEY_CASE_LOWER)
            {
                if(is_string($k)){
                   $ret[strtolower($k)]=static::arrayChangeKeyCaseRecursive($v,$case);
                } else {
                   $ret[$k]=static::arrayChangeKeyCaseRecursive($v,$case);
                }
            } else { // uppercase
                if(is_string($k))
                {
                    $ret[strtoupper($k)] = static::arrayChangeKeyCaseRecursive($v,$case);
                } else {
                    $ret[$k] = static::arrayChangeKeyCaseRecursive($v,$case);
                }
            }
        } elseif(is_string($k)) {
            if($case === static::KEY_CASE_LOWER)
            {
                $ret[strtolower($k)] = $v;
            } else { // uppercase
                $ret[strtoupper($k)] = $v;
            }
        } else {
            $ret[$k]=$v;
        }
    }
    return $ret;
}

答案 2 :(得分:0)

当您转换为小写时,您将以递归方式处理。 但是,当您转换为大写时,您只需转换第一层的键。

        if($case===static::KEY_CASE_LOWER){
            if(is_string($k)){
               $ret[strtolower($k)]=static::arrayChangeKeyCaseRecursive($v,$case);
            } else {
               $ret[$k]=static::arrayChangeKeyCaseRecursive($v,$case);
            }
        } else {
            if(is_string($k)){
                $ret[strtoupper($k)]=$v;
            } else {
                $ret[$k]=$v;
            }
        }

你也应该递归地转换为大写。

            if ($case===static::KEY_CASE_LOWER) {
                if (is_string($k)) {
                    $ret[strtolower($k)]=static::arrayChangeKeyCaseRecursive($v, $case);
                } else {
                    $ret[$k]=static::arrayChangeKeyCaseRecursive($v, $case);
                }
            } else {
                if (is_string($k)) {
                    $ret[strtoupper($k)]=static::arrayChangeKeyCaseRecursive($v, $case);
                } else {
                    $ret[$k]=static::arrayChangeKeyCaseRecursive($v, $case);
                }
            }

通过了单元测试。