php array_merge_recursive 正在用数字键替换一些键字符串
php array_merge_recursive is replacing some key strings with numeric keys
我遇到 php
函数 array_merge_recursive
的意外行为。任何建议或解决方法将不胜感激。
问题是在 array_merge_recursive
期间用数字键意外替换了字符串键。
详情:
我有三个关联数组 ($birthdays,$custom,$natHolidays
),这些值以编程方式添加到其中:
$birthdays['0808'][] = 'John MacLoud';
$birthdays['0819'][] = 'Susan MacLoud';
$birthdays['0903'][] = 'Catherine MacLoud';
$birthdays['1008'][] = 'Daisy Simpson';
$birthdays['1015'][] = 'Phillip MacLoud';
$birthdays['1212'][] = 'Aloysius Simpson';
$natHolidays['0317'][] = 'St. Patrick's Day';
$natHolidays['0317'][] = 'la Saint-Patrick';
$natHolidays['0701'][] = 'Canada Day';
$natHolidays['0701'][] = 'la fête du Canada';
$natHolidays['1031'][] = 'Hallowe'en';
$natHolidays['1031'][] = 'l'Halloween';
$natHolidays['1031'][] = 'Hallowe'en';
$natHolidays['1031'][] = 'l'Halloween';
$natHolidays['1111'][] = 'Remembrance Day';
$natHolidays['1111'][] = 'jour du souvenir';
$natHolidays['1224'][] = 'Christmas Eve';
$natHolidays['1224'][] = 'la vielle de Noël';
$natHolidays['1225'][] = 'Christmas';
$natHolidays['1225'][] = 'Noël';
$natHolidays['1226'][] = 'Boxing Day';
$natHolidays['1226'][] = 'le lendemain de Noël';
$natHolidays['1231'][] = 'New Year's Eve';
$natHolidays['1231'][] = 'vielle du jour de 'an';
$natHolidays['0907'][] = 'Labour Day';
$natHolidays['0907'][] = 'la fête du Travail';
$natHolidays['0922'][] = 'Equinox';
$natHolidays['0922'][] = 'l'equinoxe';
$natHolidays['1012'][] = 'Thanksgiving';
$natHolidays['1012'][] = 'l'action de grace';
$natHolidays['1101'][] = 'Daylight Savings ends';
$natHolidays['1101'][] = 'fall back';
$natHolidays['1221'][] = 'Solstice';
$natHolidays['1221'][] = 'le solstice';
$custom['0922'][] = 'Test value 1';
$custom['1122'][] = 'Test value 2';
然后我合并数组:$dates = array_merge_recursive($birthdays,$custom,$natHolidays);
生成的 $dates
数组输出:
["0808"]=>
array(1) {
[0]=>
string(13) "John MacLoud"
}
["0819"]=>
array(1) {
[0]=>
string(13) "Susan MacLoud"
}
["0903"]=>
array(1) {
[0]=>
string(14) "Catherine MacLoud"
}
[0]=>
array(1) {
[0]=>
string(15) "Daisy Simpson"
}
[1]=>
array(1) {
[0]=>
string(14) "Phillip MacLoud"
}
[2]=>
array(1) {
[0]=>
string(13) "Aloysius Simpson"
}
["0317"]=>
array(2) {
[0]=>
string(22) "St. Patrick's Day"
[1]=>
string(16) "la Saint-Patrick"
}
["0701"]=>
array(2) {
[0]=>
string(10) "Canada Day"
[1]=>
string(18) "la fête du Canada"
}
[3]=>
array(2) {
[0]=>
string(15) "Hallowe'en"
[1]=>
string(16) "l'Halloween"
}
[4]=>
array(2) {
[0]=>
string(15) "Remembrance Day"
[1]=>
string(16) "jour du souvenir"
}
[5]=>
array(2) {
[0]=>
string(13) "Christmas Eve"
[1]=>
string(18) "la vielle de Noël"
}
[6]=>
array(2) {
[0]=>
string(9) "Christmas"
[1]=>
string(5) "Noël"
}
[7]=>
array(2) {
[0]=>
string(10) "Boxing Day"
[1]=>
string(21) "le lendemain de Noël"
}
[8]=>
array(2) {
[0]=>
string(19) "New Year's Eve"
[1]=>
string(26) "vielle du jour de 'an"
}
["0907"]=>
array(2) {
[0]=>
string(10) "Labour Day"
[1]=>
string(19) "la fête du Travail"
}
["0922"]=>
array(3) {
[0]=>
string(14) "Test value 1"
[1]=>
string(7) "Equinox"
[2]=>
string(15) "l'equinoxe"
}
[9]=>
array(1) {
[0]=>
string(15) "Test value 2"
}
[10]=>
array(2) {
[0]=>
string(12) "Thanksgiving"
[1]=>
string(22) "l'action de grace"
}
[11]=>
array(2) {
[0]=>
string(21) "Daylight Savings ends"
[1]=>
string(9) "fall back"
}
[12]=>
array(2) {
[0]=>
string(8) "Solstice"
[1]=>
string(11) "le solstice"
}
我注意到的唯一模式是任何以 '0'
开头的键字符串(即 0130
)都按预期工作,任何以 [= 开头的键字符串22=](即1022
)用顺序数字键替换字符串键。
想法?
顺便说一句:
Creating the new tag 'array-merge-recursive' requires at least 1500
reputation. Try something from the existing tags list instead.
PHP 是松散类型,它正在转换您的数组键。
您可以使用整数作为键来避免转换:
$arr[10] = 'foo';
而不是
$arr["10"] = 'foo';
更新的答案:
转换将以“0”开头的键视为字符串,到目前为止一切顺利。其他键被视为整数,array_merge
将 renumber 它们从 0 开始(就像这里发生的那样)。
我知道您正在使用 array_merge_recursive
,但它的行为似乎是一样的。
我遇到 php
函数 array_merge_recursive
的意外行为。任何建议或解决方法将不胜感激。
问题是在 array_merge_recursive
期间用数字键意外替换了字符串键。
详情:
我有三个关联数组 ($birthdays,$custom,$natHolidays
),这些值以编程方式添加到其中:
$birthdays['0808'][] = 'John MacLoud';
$birthdays['0819'][] = 'Susan MacLoud';
$birthdays['0903'][] = 'Catherine MacLoud';
$birthdays['1008'][] = 'Daisy Simpson';
$birthdays['1015'][] = 'Phillip MacLoud';
$birthdays['1212'][] = 'Aloysius Simpson';
$natHolidays['0317'][] = 'St. Patrick's Day';
$natHolidays['0317'][] = 'la Saint-Patrick';
$natHolidays['0701'][] = 'Canada Day';
$natHolidays['0701'][] = 'la fête du Canada';
$natHolidays['1031'][] = 'Hallowe'en';
$natHolidays['1031'][] = 'l'Halloween';
$natHolidays['1031'][] = 'Hallowe'en';
$natHolidays['1031'][] = 'l'Halloween';
$natHolidays['1111'][] = 'Remembrance Day';
$natHolidays['1111'][] = 'jour du souvenir';
$natHolidays['1224'][] = 'Christmas Eve';
$natHolidays['1224'][] = 'la vielle de Noël';
$natHolidays['1225'][] = 'Christmas';
$natHolidays['1225'][] = 'Noël';
$natHolidays['1226'][] = 'Boxing Day';
$natHolidays['1226'][] = 'le lendemain de Noël';
$natHolidays['1231'][] = 'New Year's Eve';
$natHolidays['1231'][] = 'vielle du jour de 'an';
$natHolidays['0907'][] = 'Labour Day';
$natHolidays['0907'][] = 'la fête du Travail';
$natHolidays['0922'][] = 'Equinox';
$natHolidays['0922'][] = 'l'equinoxe';
$natHolidays['1012'][] = 'Thanksgiving';
$natHolidays['1012'][] = 'l'action de grace';
$natHolidays['1101'][] = 'Daylight Savings ends';
$natHolidays['1101'][] = 'fall back';
$natHolidays['1221'][] = 'Solstice';
$natHolidays['1221'][] = 'le solstice';
$custom['0922'][] = 'Test value 1';
$custom['1122'][] = 'Test value 2';
然后我合并数组:$dates = array_merge_recursive($birthdays,$custom,$natHolidays);
生成的 $dates
数组输出:
["0808"]=>
array(1) {
[0]=>
string(13) "John MacLoud"
}
["0819"]=>
array(1) {
[0]=>
string(13) "Susan MacLoud"
}
["0903"]=>
array(1) {
[0]=>
string(14) "Catherine MacLoud"
}
[0]=>
array(1) {
[0]=>
string(15) "Daisy Simpson"
}
[1]=>
array(1) {
[0]=>
string(14) "Phillip MacLoud"
}
[2]=>
array(1) {
[0]=>
string(13) "Aloysius Simpson"
}
["0317"]=>
array(2) {
[0]=>
string(22) "St. Patrick's Day"
[1]=>
string(16) "la Saint-Patrick"
}
["0701"]=>
array(2) {
[0]=>
string(10) "Canada Day"
[1]=>
string(18) "la fête du Canada"
}
[3]=>
array(2) {
[0]=>
string(15) "Hallowe'en"
[1]=>
string(16) "l'Halloween"
}
[4]=>
array(2) {
[0]=>
string(15) "Remembrance Day"
[1]=>
string(16) "jour du souvenir"
}
[5]=>
array(2) {
[0]=>
string(13) "Christmas Eve"
[1]=>
string(18) "la vielle de Noël"
}
[6]=>
array(2) {
[0]=>
string(9) "Christmas"
[1]=>
string(5) "Noël"
}
[7]=>
array(2) {
[0]=>
string(10) "Boxing Day"
[1]=>
string(21) "le lendemain de Noël"
}
[8]=>
array(2) {
[0]=>
string(19) "New Year's Eve"
[1]=>
string(26) "vielle du jour de 'an"
}
["0907"]=>
array(2) {
[0]=>
string(10) "Labour Day"
[1]=>
string(19) "la fête du Travail"
}
["0922"]=>
array(3) {
[0]=>
string(14) "Test value 1"
[1]=>
string(7) "Equinox"
[2]=>
string(15) "l'equinoxe"
}
[9]=>
array(1) {
[0]=>
string(15) "Test value 2"
}
[10]=>
array(2) {
[0]=>
string(12) "Thanksgiving"
[1]=>
string(22) "l'action de grace"
}
[11]=>
array(2) {
[0]=>
string(21) "Daylight Savings ends"
[1]=>
string(9) "fall back"
}
[12]=>
array(2) {
[0]=>
string(8) "Solstice"
[1]=>
string(11) "le solstice"
}
我注意到的唯一模式是任何以 '0'
开头的键字符串(即 0130
)都按预期工作,任何以 [= 开头的键字符串22=](即1022
)用顺序数字键替换字符串键。
想法?
顺便说一句:
Creating the new tag 'array-merge-recursive' requires at least 1500 reputation. Try something from the existing tags list instead.
PHP 是松散类型,它正在转换您的数组键。
您可以使用整数作为键来避免转换:
$arr[10] = 'foo';
而不是
$arr["10"] = 'foo';
更新的答案:
转换将以“0”开头的键视为字符串,到目前为止一切顺利。其他键被视为整数,array_merge
将 renumber 它们从 0 开始(就像这里发生的那样)。
我知道您正在使用 array_merge_recursive
,但它的行为似乎是一样的。