检查特定数组键是否在具有混合顺序和关联条目的数组中是连续的

时间:2017-05-13 15:35:12

标签: php arrays

我们说我有一个类似的数组:

$array = [
    'value1',
    71,
    'stringKey' => 'value2',
    3 => 'value3',
    4 => 'value4',
    64 => 'value5',
    'value6',
];

我想循环访问条目并根据条目是否有密钥"手动设置"来执行不同的操作。 (例如,64 => 'value5'),或者它只是一个带有"顺序"的值。密钥(例如'value1' - 实际上是0 => 'value1')。

foreach ($array as $key => $value) {
    if (/* $key has not been "manually set" (i.e., is "sequential") */) {
        $result[$value] = 'default';
    } else {
        $result[$key] = $value;
    }
}

所以我得到的数组将是:

[
    'value1' => 'default',
    71 => 'default',
    'stringKey' => 'value2',
    3 => 'value3',
    4 => 'value4',
    64 => 'value5',
    'value6' => 'default',
]

我一直在尝试array_keys(),检查是否is_numeric($key),但没有任何内容适用于上述所有条目。

我开始认为这实际上是不可能的......

1 个答案:

答案 0 :(得分:0)

你可以这样做:

$i = 0;
foreach($array as $key => $value) {
    if ($key == $i) {
        $result[$value] = 'default';
    } else {
        $result[$key] = $value;
    }
    if (is_integer($key) && $key >= $i) $i = (int)$key + 1;
}

但是,它会使4 => 'value4'与您指定的内容区别对待,因为如果您只放置'value4',则输入数组完全相同。无法从数组中确定您是否已明确提及密钥4或省略了密钥。

因此,上述代码以与处理最后一个键/值对相同的方式处理此键/值对。

输出结果为:

array (
  'value1' => 'default',
  71 => 'default',
  'stringKey' => 'value2',
  3 => 'value3',
  'value4' => 'default',
  64 => 'value5',
  'value6' => 'default',
)