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

mgdq6dx1  于 2023-10-15  发布在  PHP
关注(0)|答案(4)|浏览(138)

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

$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
5uzkadbs

5uzkadbs1#

可能最简单的解决方案:

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

hi3rlvi22#

您可以使用is_numericintval来转换密钥:

$data2 = array();
foreach($data as $key=>$value) {
    $key2 = is_numeric($key) ? intval($key) : $key;
    $data2[$key2] = $value;
}

var_dump( $data2 );
hivapdat

hivapdat3#

感谢这个伟大的建议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 )
    );
}
kupeojn6

kupeojn64#

PHP文档
此外,将发生以下密钥转换:
包含有效十进制整数的字符串,除非数字前面有+号,否则将转换为int类型。例如,键“8”实际上将存储在8下。另一方面,“08”不会被强制转换,因为它不是一个有效的十进制整数。
所以你可以使用它,你不需要检查任何条件

相关问题