我有一个数组:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
我想得到这个数组的第一个元素.预期结果:字符串 apple
一个要求:通过引用传递不能完成,因此array_shift
不是一个好的解决方案.
我怎样才能做到这一点?
确定可能关联数组中第一个键的最佳方法是什么?我第一次认为它只是预先处理数组,然后立即打破它,如下所示:
foreach ($an_array as $key => $val) break;
Run Code Online (Sandbox Code Playgroud)
因此,让$ key包含第一个键,但这似乎效率低下.有没有人有更好的解决方案?
我是多维数组中的新手,这让我很烦恼.
我的数组如下:
$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循环中获取当前数组的名称(本例中的名称)?
我想使用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
接口"还是应该测试更多的东西?
这是一个简单的循环
$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)
题 :
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 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)
我的两个问题是:
这段代码还能用吗?
如果是这样,你能解释一下(可能通过例子)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) 为什么空的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?
如何让你获得元素key
和value
在一个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)
这个方法的问题是
为什么不使用循环
为什么不使用数据库
为什么不用 SplFixedArray
这本来是解决方案,但我跟随自己,因为我没有使用正面的键(我真的这是不公平的PHP部分)
Fatal error: Uncaught exception …
Run Code Online (Sandbox Code Playgroud)在博客文章"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
将复制数组,因为如果没有,第$array
1行中的变量将被更改.
然而,唯一foreach
修改的$array
是它的内部数组指针.那么为什么$array …
foreach
在PHP7中,默认情况下,按值迭代时,根据以下内容对数组的副本进行操作:http://php.net/manual/en/migration70.incompatible.php
是否只有在对数组或值进行更改时才会懒惰地创建副本,或者它是否总是复制并实质上使引用循环进行性能优化?
此外,对象数组是否仍然循环/给你对象的引用?或者他们实际上是否也会创建副本foreach
并按值返回对象?