由于数组的序列化/反序列化,在某些情况下我会得到不正确的数组键数据类型。
$data = [
0 => 'item 1',
4 => 'item 2',
7 => 'item 3',
];
$storage->set( 'demo', $data );
// ...and get it back later
$data = storage->get( 'demo' );
var_dump( $data );
/*
Result:
array (size=3)
"0" => string "item 1"
"4" => string "item 2"
"7" => string "item 3"
But I need (keys must be int):
array (size=3)
0 => string "item 1"
4 => string "item 2"
7 => string "item 3"
*/
问题:有没有一种简单的方法可以将密钥转换回整数?
我尝试了array_reverse( array_map( 'intval', array_reverse( $data ) ) )
,但这会丢失具有不同键但值相同的项目,最重要的是它会出现非数字键问题。
同样array_values( $data )
由于类似问题而无法解决问题:它丢失了非数字键,而且键也不是顺序的(可以是0, 4, 7
,但array_values()
会分配键0, 1, 2
)
更新 - 为什么这对我的
很重要我们遇到了一些网站配置问题:
$data['0']
返回'item1'
,但$data[0]
返回null
答案 0 :(得分:1)
您可以使用is_numeric
和intval
转换密钥:
$data2 = array();
foreach($data as $key=>$value) {
$key2 = is_numeric($key) ? intval($key) : $key;
$data2[$key2] = $value;
}
var_dump( $data2 );
答案 1 :(得分:1)
最简单的解决方案:
$keys = array_keys($data);
$values = array_values($data);
$intKeys = array_map('intval', $keys);
$newData = array_combine($intKeys, $values);
<强>更新强>:
检查密钥类型:
$keys = array_keys($data);
if ($keys === array_filter($keys, 'is_numeric')) {
$data = array_combine(
array_map('intval', $keys),
array_values($data)
);
}
答案 2 :(得分:0)
感谢这个伟大的建议https://stackoverflow.com/a/45505894/313501我提出了这个代码:
// Convert array keys to integer values, if array only contains numeric keys.
$is_numeric = array_reduce(
array_keys( $data ),
function( $res, $val ) { return $res && is_numeric( $val ); },
true
);
if ( $is_numeric ) {
$data = array_combine(
array_map( 'intval', array_keys( $data ) ),
array_values( $data )
);
}