Skip to content

Commit a0387a4

Browse files
authored
Merge pull request #567 from tomterl/patch-2
2 parents 5f40f4c + e7c4cc2 commit a0387a4

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

src/types/array/array_key.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ pub enum ArrayKey<'a> {
1818
impl From<String> for ArrayKey<'_> {
1919
fn from(value: String) -> Self {
2020
if let Ok(index) = i64::from_str(value.as_str()) {
21-
Self::Long(index)
21+
if value == "0" || !value.starts_with('0') {
22+
Self::Long(index)
23+
} else {
24+
Self::String(value)
25+
}
2226
} else {
2327
Self::String(value)
2428
}
@@ -77,7 +81,11 @@ impl Display for ArrayKey<'_> {
7781
impl<'a> From<&'a str> for ArrayKey<'a> {
7882
fn from(value: &'a str) -> ArrayKey<'a> {
7983
if let Ok(index) = i64::from_str(value) {
80-
Self::Long(index)
84+
if value == "0" || !value.starts_with('0') {
85+
ArrayKey::Long(index)
86+
} else {
87+
ArrayKey::Str(value)
88+
}
8189
} else {
8290
ArrayKey::Str(value)
8391
}
@@ -160,4 +168,30 @@ mod tests {
160168
assert!(result.is_err());
161169
assert!(matches!(result.unwrap_err(), Error::InvalidProperty));
162170
}
171+
172+
#[test]
173+
fn test_from_str_with_leading_zeros() {
174+
let key: ArrayKey = "00".into();
175+
assert_eq!(key, ArrayKey::Str("00"));
176+
let key: ArrayKey = "071".into();
177+
assert_eq!(key, ArrayKey::Str("071"));
178+
let key: ArrayKey = "0".into();
179+
assert_eq!(key, ArrayKey::Long(0));
180+
}
181+
182+
#[test]
183+
fn test_from_string_with_leading_zeros() {
184+
let key = ArrayKey::String("042".to_string());
185+
let result: crate::error::Result<String, _> = key.try_into();
186+
assert!(result.is_ok());
187+
assert_eq!(result.unwrap(), "042");
188+
let key = ArrayKey::String("00".to_string());
189+
let result: crate::error::Result<String, _> = key.try_into();
190+
assert!(result.is_ok());
191+
assert_eq!(result.unwrap(), "00");
192+
let key = ArrayKey::String("0".to_string());
193+
let result: crate::error::Result<i64, _> = key.try_into();
194+
assert!(result.is_ok());
195+
assert_eq!(result.unwrap(), 0);
196+
}
163197
}

tests/src/integration/array/array.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,18 @@
6464
1 => 'bar',
6565
2 => 'baz',
6666
]);
67+
68+
$leading_zeros = test_array_assoc_array_keys([
69+
'0' => 'zero',
70+
'00' => 'zerozero',
71+
'007' => 'bond',
72+
]);
73+
74+
assert(array_key_exists(0, $leading_zeros), '"0" should become integer key 0');
75+
assert($leading_zeros[0] === 'zero', 'Value at key 0 should be "zero"');
76+
77+
assert(array_key_exists('007', $leading_zeros), '"007" should stay as string key');
78+
assert($leading_zeros['007'] === 'bond', 'Value at key "007" should be "bond"');
79+
80+
assert(array_key_exists('00', $leading_zeros), '"00" should stay as string key');
81+
assert($leading_zeros['00'] === 'zerozero', 'Value at key "00" should be "zerozero"');

0 commit comments

Comments
 (0)