注意:在PHP中尝试递增关联数组时未定义索引

ubby3x7f  于 2023-09-29  发布在  PHP
关注(0)|答案(7)|浏览(68)

我尝试在每次出现重复变量时增加$variable的值。我不确定这在语法上是否正确,但我认为这在语义上是正确的。var_dump似乎吐出了正确的输出,但我得到了这个错误:注意:未定义索引...

$newarray = array();
foreach ($array as $variable)
{
    $newarray[$variable]++; 
    var_dump($newarray);
}

$array =(0 => h,1 => e,2 => l,3=> l,4=> o);
目标:

'h' => int 1
'e' => int 1
'l' => int 2
'o' => int 1

我的代码工作,只是我得到了一些奇怪的通知。

x9ybnkn6

x9ybnkn61#

<?php
$newarray = array();
foreach ($array as $variable) {
    if ( !array_key_exists($variable, $newarray) ) {
        $newarray[$variable] = 0;
    }
    ++$newarray[$variable];
}
var_dump($newarray);

但是你也可以使用array_count_values()

js5cn81o

js5cn81o2#

$newarray = array();
foreach ($array as $variable)
{
    if(!isset($newarray[$variable]))
      $newarray[$variable] = 0;

      $newarray[$variable]++; 
    var_dump($newarray);
}
nfeuvbwi

nfeuvbwi3#

我非常喜欢MickMackusa在

$new = [];
foreach ($array as $v) {
    $new[$v] ??= 0;
    ++$new[$v];
}

但是你可以使用数组元素引用保存第二次查找,如果不存在,它会自动插入null元素:

$new = [];
foreach ($array as $v) {
    $entry =& $new[$v];
    ++$entry;
}

幸运的是,递增运算符将null视为零,并根据需要递增到1。

7hiiyaii

7hiiyaii4#

你正在增加错误的东西,试试这个:

foreach ($array as $key => $variable) {
   $array[$key]++; 
   var_dump($array);
}
qpgpyjmq

qpgpyjmq5#

$newarray = array();
foreach ($array as $variable)
{
    if (!isset($newarray[$variable])) {
        $newarray[$variable] = 0;
    }
    $newarray[$variable]++;
}
kb5ga3dv

kb5ga3dv6#

看一下函数array_count_values()。它做的正是你想做的。
示例来自php.net:

$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));

测试结果:

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)
sqougxex

sqougxex7#

在现代PHP中,您可以通过利用null合并运算符来避免isset()调用。在下面的代码片段中,如果变量尚未声明,则该技术将变量设置为0。然后你可以自由地使用一系列的速记操作,如串联,算术等。

$new = [];
foreach ($array as $v) {
    $new[$v] = ($new[$v] ?? 0) + 1;
}

或者,如果你想继续使用++,那么你可以使用“null合并赋值运算符”。如果变量已经声明,则赋值右侧的逻辑甚至不会执行。下面的代码段将执行与上面的代码段相同的操作。

$new = [];
foreach ($array as $v) {
    $new[$v] ??= 0;
    ++$new[$v];
}

至于您的示例数据和所需的字母和计数结果,我可能会使用完全原生的函数式方法。(Demo

var_export(
    array_count_values(str_split('hello'))
); // letters are in the same order as they were encountered

同样的结果,吸引力要小得多的技术:

$assoc = count_chars('hello', 1);
var_export(
    array_reduce(
        array_keys($assoc),
        fn($result, $k) => $result += [chr($k) => $assoc[$k]],
        []
    )
); // letters are alphabetized

相关问题