我已经创建了一个自定义函数来处理递归更改数组键的情况。
以下是类中的静态常量:
/**
* 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);
}
我似乎无法弄明白。任何帮助,将不胜感激。谢谢!
答案 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);
}
}
通过了单元测试。