【问题标题】:php array_merge_recursive is replacing some key strings with numeric keysphp array_merge_recursive 正在用数字键替换一些键字符串
【发布时间】:2020-02-20 15:00:27
【问题描述】:

我在使用 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)开头的键字符串都按预期工作,并且任何以'1'开头的键字符串(即@ 987654332@) 用连续的数字键替换字符串键。

想法?

顺便说一句:

创建新标签 'array-merge-recursive' 至少需要 1500 名声。试试现有标签列表中的一些内容。

【问题讨论】:

    标签: php associative-array array-merge


    【解决方案1】:

    PHP 是松散类型的,它正在转换您的数组键。

    您可以使用整数作为键来避免强制转换:

    $arr[10] = 'foo';
    

    而不是

    $arr["10"] = 'foo';
    

    更新答案:

    强制转换将以“0”开头的键视为字符串,到目前为止一切顺利。其他键被视为整数,array_mergerenumber 它们从 0 开始(就像这里发生的那样)。

    我知道您使用的是array_merge_recursive,但它的行为似乎相同。

    【讨论】:

    • 密钥中的 MMDD 字符串似乎是在 DOY 和数据之间建立联系的最简单方法——替代方案似乎需要更长和更复杂的解决方法。我想我的“深入研究”问题是:“为什么php 在这种特殊情况下将字符串转换为整数?我了解转换,但我不明白这个例子是如何遵守这些规则。
    • 嘿@Parapluie,我已经更新了我的答案,也许它可以帮助你更多。
    • 我花了一段时间才完全理解这一点,但我现在明白发生了什么。您的回答有所帮助,就像有人从不同方向提出的这个问题一样:stackoverflow.com/questions/4100488/…。我认为在我的密钥前面加上一个虚拟的字母字符应该可以解决转换问题(['d0130'])。这是多么奇怪的一个!
    猜你喜欢
    • 2012-08-16
    • 2011-01-04
    • 1970-01-01
    • 2014-10-07
    • 2015-02-01
    • 1970-01-01
    • 2011-02-20
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多