相关疑难解决方法(0)

获取数组的第一个元素

我有一个数组:

array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )

我想得到这个数组的第一个元素.预期结果:字符串 apple

一个要求:通过引用传递不能完成,因此array_shift不是一个好的解决方案.

我怎样才能做到这一点?

php arrays

1015
推荐指数
24
解决办法
132万
查看次数

获取(可能)关联数组中的第一个键?

确定可能关联数组中第一个键的最佳方法是什么?我第一次认为它只是预先处理数组,然后立即打破它,如下所示:

foreach ($an_array as $key => $val) break;
Run Code Online (Sandbox Code Playgroud)

因此,让$ key包含第一个键,但这似乎效率低下.有没有人有更好的解决方案?

php arrays

729
推荐指数
12
解决办法
55万
查看次数

PHP foreach更改原始数组值

我是多维数组中的新手,这让我很烦恼.

我的数组如下:

$fields = array(
    "names" => array(
         "type"         => "text",
         "class"        => "name",
         "name"         => "name",
         "text_before"  => "name",
         "value"        => "",
         "required"     => true,
    )
)
Run Code Online (Sandbox Code Playgroud)

然后我得到一个函数检查是否填写了这些输入,如果需要的话.

function checkForm($fields){
    foreach($fields as $field){
        if($field['required'] && strlen($_POST[$field['name']]) <= 0){
            $fields[$field]['value'] = "Some error";
        }
    }
    return $fields;
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是这一行

$fields[$field]['value'] = "Some error";
Run Code Online (Sandbox Code Playgroud)

我想更改原始数组的内容,因为我正在返回它,但是如何在foreach循环中获取当前数组的名称(本例中的名称)?

php arrays foreach

127
推荐指数
3
解决办法
16万
查看次数

如何检查变量是否是数组?...或类似数组的东西

我想使用foreach带变量的循环,但是这个变量可以是许多不同的类型,NULL例如.

所以在foreach我测试它之前:

if(is_array($var)){
  foreach($var as ...
Run Code Online (Sandbox Code Playgroud)

但我意识到它也可以是一个实现Iterator接口的类.也许我是盲人,但如何检查类是否实现接口?是否有类似is_a函数或inherits运算符的东西?我发现class_implements,我可以使用它,但也许有更简单的东西?

第二,更重要的是,我认为这个函数存在,足以检查变量is_array或"实现Iterator接口"还是应该测试更多的东西?

php arrays foreach

85
推荐指数
3
解决办法
13万
查看次数

foreach循环中current()的意外行为

这是一个简单的循环

$list = array("A", "B", "C","D");
foreach ($list as $var) {
    print(current($list));
}
Run Code Online (Sandbox Code Playgroud)

输出(演示)

 BBBB   // Output for 5.2.4 - 5.5.0alpha4
 BCD    // Output for 4.4.1
 AAAA   // Output for 4.3.0 - 4.4.0, 4.4.2 - 5.2.3
Run Code Online (Sandbox Code Playgroud)

题 :

  • 有人可以解释一下发生什么事吗?
  • 为什么我没有得到ABCD
  • 即使数组的副本是由foreach我制作的,AAAA但是在当前的PHP稳定版本中没有得到它

注意*我知道我可以简单地使用print $var来自PHP DOC

current - 返回数组中的当前元素current()函数只返回内部指针当前指向的数组元素的值.它不会以任何方式移动指针.如果内部指针指向超出元素列表末尾或数组为空,则current()返回FALSE.

更新1 - 新观察

感谢Daniel Figueroa:只需通过包装current功能,您就可以得到不同的结果

foreach ( $list as $var ) {
    print(item($list));
}

function item($list) { …
Run Code Online (Sandbox Code Playgroud)

php arrays foreach loops

39
推荐指数
1
解决办法
1790
查看次数

PHP 7更改为foreach:我是否仍然可以删除我正在迭代的数组中的项目?

PHP 7向后兼容的改变文件说,有关的foreach如下:

在默认的按值模式下使用时,foreach现在将对正在迭代的数组的副本进行操作,而不是对数组本身进行操作.这意味着在迭代期间对数组所做的更改不会影响迭代的值.

我试图理解这意味着什么,我的主要问题是这个代码在PHP 7中是否与PHP 5.6中的相同?

foreach($array as $elementKey => $element) {
    if ($element == 'x') {
        unset($array[$elementKey]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的两个问题是:

  1. 这段代码还能用吗?

  2. 如果是这样,你能解释一下(可能通过例子)PHP 7中的这一新变化意味着什么吗?

编辑

我一直在重读这份文件声明.我认为这意味着,如果您更改数组中较低项的值,那么当您在迭代中找到这些项时,这些更改将不会存在.例:

$array = ['x', 'y', 'z'];

$new = [];

foreach($array as $element) {
    if ($element == 'x') {
        $array[2] = 'a';
    }

    $new[] = $element;
}

print_r($new);
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这个例子时,它似乎没有显示PHP版本的任何差异(虽然我以前从未使用过这个工具,所以我不确定它是如何工作的).

我意识到,如果我通过参考来做,我会得到一个a新的.否则我不会.但这两个版本似乎都是这种情况.

我真正需要知道的是什么是不兼容性(例如)?

编辑2

@NikiC 建议答案链接提供了我正在寻找的故事的其余部分:

在大多数情况下,这种变化是透明的,除了更好的性能外没有其他影响.但是有一种情况会导致不同的行为,即数组事先是参考的情况:

$array = [1, 2, 3, 4, 5]; …
Run Code Online (Sandbox Code Playgroud)

php php-7

26
推荐指数
1
解决办法
1万
查看次数

foreach循环和&$ value的引用

为什么空的foreach循环可以改变结果.

我有以下代码:

$variable = [1,2,3,4];
foreach ($variable  as $key => &$value) 
  $value ++;

var_dump($variable);
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

array (size=4)
  0 => int 2
  1 => int 3
  2 => int 4
  3 => &int 5
Run Code Online (Sandbox Code Playgroud)

现在,当我像这样添加一个空的foreach循环时:

$variable  = [1,2,3,4];
foreach ($variable  as $key => &$value) 
  $value ++;

foreach ($variable  as $key => $value);
  var_dump($variable);
Run Code Online (Sandbox Code Playgroud)

我明白了:

array (size=4)
  0 => int 2
  1 => int 3
  2 => int 4
  3 => &int 4
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下为什么当我添加第二个空循环时最后一个元素不会改变,以及为什么最后一个元素有一个&infront?

php arrays foreach

21
推荐指数
3
解决办法
9150
查看次数

在没有循环的数组中的N位置获取元素

如何让你获得元素keyvalue在一个n在无环中特定位置的位置阵列.

想像

$postion = 3; // get array at 3rd position
$array = array(
        "A" => "Four",
        "B" => "twp",
        "C" => "three",
        "D" => "Four",
        "E" => "Five",
        "F" => "Four");


$keys = array_keys($array);
$value = array_values($array);

echo implode(array_slice($keys, $postion, 1)), PHP_EOL; // Key at 3rd posstion
echo implode(array_slice($value, $postion, 1)), PHP_EOL; // Value at n position
Run Code Online (Sandbox Code Playgroud)

产量

D
Four
Run Code Online (Sandbox Code Playgroud)

这个方法的问题是

  • 多次复制数组导致更高的内存使用率

为什么不使用循环

  • 你必须多次获得多个位置.循环大数据集也不高效

为什么不使用数据库

  • 是的,使用基于内存的数据库(如Redis)可以使生活更轻松,但是特定的阵列优化

为什么不用 SplFixedArray

php arrays

16
推荐指数
2
解决办法
6051
查看次数

为什么foreach在我们没有在循环中修改它时复制数组?

在博客文章"PHP Internals:什么时候复制foreach"中,NikiC表示在这样的代码中:

片段1

$array = range(0, 100000);
foreach ($array as $key => $value) {
    xdebug_debug_zval('array'); // array is not copied, only refcount is increased
}
Run Code Online (Sandbox Code Playgroud)

foreach不会复制数组,因为唯一foreach修改的$array是它的内部数组指针.

他还说在这样的代码中:

片段2

$array = range(0, 100000); // line 1
test($array);
function test($array) { 
    foreach ($array as $key => $value) { // line 4
        xdebug_debug_zval('array'); // array is copied, refcount not increased
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

foreach将复制数组,因为如果没有,第$array1行中的变量将被更改.

然而,唯一foreach修改的$array是它的内部数组指针.那么为什么$array …

php arrays foreach php-internals

12
推荐指数
1
解决办法
1593
查看次数

PHP7中的foreach更改

foreach在PHP7中,默认情况下,按值迭代时,根据以下内容对数组的副本进行操作:http://php.net/manual/en/migration70.incompatible.php

是否只有在对数组或值进行更改时才会懒惰地创建副本,或者它是否总是复制并实质上使引用循环进行性能优化?

此外,对象数组是否仍然循环/给你对象的引用?或者他们实际上是否也会创建副本foreach并按值返回对象?

php foreach php-7

10
推荐指数
1
解决办法
4513
查看次数

标签 统计

php ×10

arrays ×8

foreach ×6

php-7 ×2

loops ×1

php-internals ×1