Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何检测foreach中有值和无值的项_Php_Arrays_Foreach - Fatal编程技术网

PHP:如何检测foreach中有值和无值的项

PHP:如何检测foreach中有值和无值的项,php,arrays,foreach,Php,Arrays,Foreach,考虑这个例子: $arr = array('bla', 'foo', 'baz' => 2); foreach ($arr as $arrKey => $arrValue) { echo $arrValue . PHP_EOL; } 这将输出: bla foo 2 但是如何在foreach循环中检测哪些项具有值,哪些项具有定义的键+值?您可以测试$arrKey是否不是数字,然后显示它 试试这个: $arr = array('bla', 'foo', 'baz' =>

考虑这个例子:

$arr = array('bla', 'foo', 'baz' => 2);

foreach ($arr as $arrKey => $arrValue) {
    echo $arrValue . PHP_EOL;
}
这将输出:

bla
foo
2

但是如何在
foreach
循环中检测哪些项具有值,哪些项具有定义的键+值?

您可以测试
$arrKey
是否不是数字,然后显示它

试试这个:

$arr = array('bla', 'foo', 'baz' => 2);

foreach ($arr as $arrKey => $arrValue) {
    if(is_numeric($arrKey))
        echo $arrValue . PHP_EOL;
    else
        echo $arrKey."  ".$arrValue . PHP_EOL;
}
这将输出:

bla 
foo 
baz 2

如果任何元素都没有关联键,它将具有默认的数字键,例如0、1、2。。。等等

所以,
array('bla','foo','baz'=>2)
就是
array(0=>'bla',1=>'foo',baz'=>2)

所以,如果您想挑出具有关联键的元素,您可以尝试

 $arr = array('bla', 'foo', 'baz' => 2);

foreach ($arr as $arrKey => $arrValue) {
    if(!is_numeric($arrKey))
    {
        //do your code here
    }
    else
    {
        //additional code
    }
}

您的阵列可以更好地工作,因为:

$arr = ['bla', 'foo', ['baz' => 2]];
然后你可以这样构造你的foreach:

foreach ($arr as $a) {
    if (is_array($a)) {
        foreach ($a as $key => $val) {
            echo $val . PHP_EOL;
        }
    } else {
        echo $a . PHP_EOL;
    }
}

您感到困惑的原因是您对数组的工作方式没有完全的了解

$arr = array('bla', 'foo', 'baz' => 2);
这将计算为3的数组,所有数组都有值。 这就是它的输出:

Array
(
    [0] => bla
    [1] => foo
    [baz] => 2
)
当您在不指定键的情况下按下一个值时,它的键是第一个可用的数字索引。
这就是为什么在您的例子中,索引0和1得到值“bla”和“foo”。2是推送到数组的第三个值,它的值不是2而是“baz”,因为这是您指定的值

这一行:

$arr = array('bla', 'foo', 'baz' => 2);
还有这个:

$arr = array(0 => 'bla', 1 => 'foo', 'baz' => 2);
都是一模一样的东西

如果需要空密钥,请执行以下操作:

$arr = array('bla', 'foo', 'baz' => '');
输出:

Array
(
    [0] => bla
    [1] => foo
    [baz] => 
)

若并没有提到键,php将为值分配默认键

eg : $arr = array('bla', 'foo', 'baz' => 2); will be 
     $arr = array(0=>'bla', 1=>'foo', 'baz' => 2);
若要分隔,则可以检查键是否为数字

Othercase-检查数字和索引

$arr = array('bla', 'foo', 'baz' => 2,'test');

$cnt = 0;
foreach ($arr as $arrKey => $arrValue) {

    if(is_numeric($arrKey) && $cnt == $arrKey) {
        echo $arrValue . PHP_EOL;       
        $cnt = $cnt + 1;
    } else {
        echo $arrKey . ':' .$arrValue . PHP_EOL;
    }

}
已编辑:数组整数值索引已存在,然后只需分配cnt值,它将从此处自动递增

if(is_numeric($arrKey)) {

    if($cnt == $arrKey) {
      echo $arrValue . PHP_EOL;     
      $cnt = $cnt + 1;
   } else {
     echo $arrKey . ':' .$arrValue . PHP_EOL;
     $cnt = $arrKey;
   }
} else {

  echo $arrKey . ':' .$arrValue . PHP_EOL;
}

没有附加值这回事。数组元素有值,或者没有值。前两个元素没有关联的键,因此它们被视为值。拥有一个由命名键和未命名键混合而成的数组很少是理想的。你说的是语义,你知道我所说的“附加值”是什么意思。你有没有可能把你的问题写得乱七八糟,你的意思是问“如何检查空值”而不是键?对于每个条目,后者总是存在的。空值将是一个空字符串(
[0=>'')
)。要过滤空值,请使用。我已编辑了我的问题以使其更清楚。我想这更多的是关于如何定义它。但是,
foreach
无法“看到”这一点。如果您知道它始终是数字的,这没关系,但如果不是呢?@kasimir,如果您没有指定
键,那么它将自动具有默认的数字键,如0、1、2。是的,对不起,我的意思是,如果带值的键是数字,那该怎么办?在你考虑以贬低的方式回答这个问题之前,我就理解了这一点。这其实是一个评论,而不是一个回答。这不是一个贬低的回答。你问你的问题是因为你有问题,是因为你还不知道如何做某事,还是因为你误解了一些不相关的事情。这并没有什么丢脸的地方,我回答的目的是确保人们能够理解数组的键是如何工作的,不管他们的理解程度如何。如果你有这种感觉,那么我很抱歉,因为这根本不是我的目标。如果您已经知道了这一点,那么我不理解为什么您将数组值称为“附加值”,并说索引值“为空”。关于它的更多信息可能会有所帮助。我只是想参考PHP的官方文档(以获取更多信息)。;-)这是一个有趣的解决方案,它在某种程度上将意图嵌入到结构中。接受您的答案,因为其他所有元素都会自动进入元素中,获得一个数字键(除非定义了键)。要区分已显式定义的数组键和未显式定义的数组键,@HamzaAbdaoui、@Rajapandian和@A Jツ 提到检查键是否为数字的解决方案,但这并不适用于所有情况。正如我所说,您的解决方案通过将一个元素定义为数组来嵌入数组元素之间的差异。这保证了您以后可以进行区分,例如在
foreach
循环中。