相关疑难解决方法(0)

PHP'foreach'如何实际工作?

让我通过说我知道它是什么foreach,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach".


很长一段时间,我认为这foreach与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.

让我说明我的意思.对于以下测试用例,我们将使用以下数组:

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

测试案例1:

foreach ($array as $item) {
  echo "$item\n";
  $array[] = $item;
}
print_r($array);

/* Output in loop:    1 2 3 4 5
   $array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)

这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:

测试案例2:

foreach ($array as $key => $item) {
  $array[$key + 1] = $item + 2;
  echo "$item\n";
}

print_r($array);

/* Output …
Run Code Online (Sandbox Code Playgroud)

php iteration foreach loops php-internals

1926
推荐指数
7
解决办法
39万
查看次数

获取数组的第一个元素

我有一个数组:

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

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

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

我怎样才能做到这一点?

php arrays

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

如何从关联PHP数组中获取第一项?

如果我有一个像这样的数组:

$array['foo'] = 400;
$array['bar'] = 'xyz';
Run Code Online (Sandbox Code Playgroud)

而且我想在不知道密钥的情况下从该阵列中获取第一个项目,我该怎么做?这有功能吗?

php

135
推荐指数
8
解决办法
18万
查看次数

在PHP中返回关联数组的第一个键

我试图array_keys()通过引用来获取关联数组的第一个键,而不创建临时变量等.不幸的是,reset()并且array_shift()通过引用获取数组参数,因此似乎都不是可行的结果.

用PHP 5.4我将在天堂; array_keys($array)[0];,但不幸的是,这当然也不是一种选择.

我可以创建一个函数来实现这个目的,但我只能想象有一些PHP的array_*函数可以在单个语句中产生所需的结果,这是我想不到的或者想出来的.

所以:

$array = array('foo' => 'bar', 'hello' => 'world');

$firstKey = assorted_functions($array); // $firstKey = 'foo'
Run Code Online (Sandbox Code Playgroud)

在我的问题中"无参考"条款的原因只是因为我认为array_keys()是必需的(如果有一种方式通过参考,请消防)

我会使用key(),但这需要一个,reset()因为我不确定此操作时指针的位置.


附录

我正在跟进我最近的一个实现:正如我在评论中提到的,它将使用相同的内存,所以如果这是一个问题,这个问题没有解决方案.

$a = range(0,99999);
var_dump(memory_get_peak_usage()); // int(8644416)
$k = array_keys($a)[0];
var_dump(memory_get_peak_usage()); // int(17168824)
Run Code Online (Sandbox Code Playgroud)

我知道这一点,因为PHP没有这样的优化功能,但认为有必要明确提及.

接受的答案的简洁性很好,如果你正在使用合理大小的数组,那么它们就可以工作了.

php arrays associative-array key

36
推荐指数
2
解决办法
8万
查看次数

获取数组中索引的名称

可能重复:
获取[可能]关联数组中的第一个键?

我有这个数组:

Array
(
    ['foobar'] => Array
        (
            [key1] => value1
            [key2] => value2
        )

)
Run Code Online (Sandbox Code Playgroud)

我想得到第一个索引(foobar)的名称.我该怎么做?

php

6
推荐指数
2
解决办法
2万
查看次数

获得用户的角色 - Yii2

我正在为登录用户搜索用户角色,我没有得到如何打印用户角色名称.我试过这个:

$Role = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId());
Run Code Online (Sandbox Code Playgroud)

什么时候,我做了print_r($Role); 我懂了 :

Array ( [superadmin] => yii\rbac\Role Object ( [type] => 1 [name] => superadmin [description] => Super admin can do any operation in the application [ruleName] => [data] => [createdAt] => [updatedAt] => ) )
Run Code Online (Sandbox Code Playgroud)

我希望获得特定的角色名称,但我无法访问

Array ( [superadmin] => yii\rbac\Role Object ........)
           ^ unable to access this name.
Run Code Online (Sandbox Code Playgroud)

打字时print_r($Role[0]->name);我得到的错误就像

PHP注意 - yii\base\ErrorException

未定义的偏移量:0

并且,如果我喜欢这种方式(意味着,手动传递$rolename给数组索引)它正在工作.

$roleName = 'superadmin';

print_r($Role[$roleName]->name);
Run Code Online (Sandbox Code Playgroud)

为什么这个要求来找我,因为对于登录用户它是好的.但是,如果我想知道其他用户角色名称,那么我需要在这里传递索引名称$Role[$roleName]->name

请帮我看看'superadmin'.我没有得到如何得到它的索引名称.

Array ( [superadmin] => yii\rbac\Role Object …
Run Code Online (Sandbox Code Playgroud)

php yii2 yii2-advanced-app yii2-basic-app yii2-user-roles

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