从数组构建数组时:IF var 为 SET,INCREMENT else SET 为 1

When building an array from an array: IF var is SET, INCREMENT else SET to 1

提问人:Ben 提问时间:3/24/2023 最后编辑:Ben 更新时间:3/27/2023 访问量:47

问:

嗨,我尝试了很多解决方案,但找不到我想要的东西。我正在从许多其他数组构建一个数组,我可以做这样的事情:

isset($setinc) ? $setinc++ : $setinc=1;

但是,当 var 为:

$output[ $data[ 'electoral_nation' ] ][ 'regions' ][ $data[ 'electoral_region' ] ][ 'constituencies' ][ $data[ 'electoral_constituency_id' ] ][ 'national_candidates' ]

当有超过 600 个比较和循环时,一切都变得非常混乱,有没有办法简化它而不是这个?

isset($output[ $data[ 'electoral_nation' ] ][ 'regions' ][ $data[ 'electoral_region' ] ][ 'constituencies' ][ $data[ 'electoral_constituency_id' ] ][ 'national_candidates' ]) ? $output[ $data[ 'electoral_nation' ] ][ 'regions' ][ $data[ 'electoral_region' ] ][ 'constituencies' ][ $data[ 'electoral_constituency_id' ] ][ 'national_candidates' ]++ : $output[ $data[ 'electoral_nation' ] ][ 'regions' ][ $data[ 'electoral_region' ] ][ 'constituencies' ][ $data[ 'electoral_constituency_id' ] ][ 'national_candidates' ]=1;

我正在运行 PHP8,因此 null 合并运算符是一个选项,但无法完全理解它。这是为了停止未定义的数组键错误。

提前致谢!

编辑:好的,所以上面的一些内容似乎让人分心。因此,要澄清。有没有办法写以下内容,但只声明一次$setinc

isset($setinc) ? $setinc++ : $setinc=1;

isset($setinc) ? += 1 : == 1;
php 数组 isset undefined-index

评论

1赞 nice_dev 3/24/2023
分享一个最小可重复的例子,说明你要实现的目标。
0赞 mickmackusa 3/24/2023
这个问题与PHP有很大不同吗:什么值数组键需要什么值才能导致下一个数字键赋值? ?你能不能利用 如何在 PHP 中重新索引数组但索引从 1 开始的建议?
0赞 JC Cavalca 3/24/2023
为什么不创建对象?因为$output看起来是一个非常大的阵列。
0赞 Ben 3/26/2023
谢谢大家。很好,我今天会尝试这样做。米克,我相信是的,它非常不同。JC,那有什么好处呢?

答:

0赞 JC Cavalca 3/24/2023 #1

这不是一个完美的例子,因为你必须改变命名,但我认为它足够简短和干净。 最后一件事,您必须检查“选区”中的关键$electoralConstituencyId是否存在其他情况。在这个例子中,我不这样做。

$electoralNation = $data[ 'electoral_nation' ] ?? null;
$electoralRegion = $data[ 'electoral_region' ] ?? null;
$dataElectoralConstituencyId = $data[ 'electoral_constituency_id' ?? null;

if (null === $electoralNation || null === $electoralRegion || null === $dataElectoralConstituencyId) {
    throw exception;
}

$keysInRightOrder = [$electoralNation, 'regions', $electoralRegion, 'constituencies', $electoralConstituencyId];

if ($this->arrayKeysInOrderExists($keysInRightOrder, $output)) {
    $output[$electoralNation]['regions'][$electorRegion]['constituencies'][$electoralConstituencyId]++;
} else {
    $output[$electoralNation]['regions'][$electorRegion]['constituencies'][$electoralConstituencyId] = 1;
}


public function arrayKeysInOrderExists(array $keys, array $array): bool
{
    foreach ($keys as $key) {
        if (array_key_exists($key, $array)) {
            $array = $array[$key];
        } else {
            return false;
        }
    }
    
    return true;
}