将数组键从数字字符串转换为整数

时间:2017-08-04 10:25:37

标签: php arrays

由于数组的序列化/反序列化,在某些情况下我会得到不正确的数组键数据类型。

$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

3 个答案:

答案 0 :(得分:1)

您可以使用is_numericintval转换密钥:

$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 )
    );
}