相关疑难解决方法(0)

在PHP中FOR FOR FOR FORACH的性能

首先,我理解90%的应用程序中性能差异完全不相关,但我只需要知道哪个是更快的构造.那......

目前在网上提供的信息令人困惑.很多人说foreach很糟糕,但从技术上来说它应该更快,因为它假设使用迭代器简化了数组遍历的编写.迭代器,再次假设更快,但在PHP中也显然死得很慢(或者这不是PHP的东西?).我在谈论数组函数:next()prev()reset()等等,如果它们是偶数函数而不是那些看起来像函数的PHP语言特性之一.

为了缩小这个范围:我在以超过1的步长遍历数组时没有兴趣(也没有负步骤,即反向迭代).我也对从任意点到任意点的遍历不感兴趣,只有0到长度.我也没有看到定期操作超过1000个键的数组,但我确实看到一个数组在应用程序的逻辑中被遍历了多次!另外,对于操作,主要是字符串操作和回声.

以下是一些参考站点:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php

我到处听到的内容:

  • foreach很慢,因此for/ while更快
  • PHP foreach复制它迭代的数组; 为了使它更快你需要使用引用
  • 像这样的代码:比a更快$key = array_keys($aHash); $size = sizeOf($key);
    for ($i=0; $i < $size; $i++)
    foreach

这是我的问题.我写了这个测试脚本:http://pastebin.com/1ZgK07US,无论我运行脚本多少次,我得到这样的东西:

foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Run Code Online (Sandbox Code Playgroud)

简而言之:

  • foreachforeach参考更快
  • foreach 比...更快 for
  • foreachfor比哈希表更快

谁能解释一下?

  1. 难道我做错了什么?
  2. PHP foreach引用的东西真的有所作为吗?我的意思是,如果你通过引用传递它为什么不复制它?
  3. foreach语句的等效迭代器代码是什么; 我在网上看到了一些,但每次我测试它们的时机都是关闭的; 我还测试了一些简单的迭代器结构,但似乎从来没有得到过不错的结果 - PHP中的数组迭代器是不是很糟糕?
  4. 是否有更快的方法/方法/构造来迭代除FOR/FOREACH(和WHILE)之外的数组?

PHP版本5.3.0


编辑:答案 在这里的人的帮助下,我能够拼凑出所有问题的答案.我在这里总结一下:

  1. "难道我做错了什么?" …

php arrays performance foreach for-loop

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

在php中的foreach循环中更改关联数组的$ key

我有这样一个数组:

array(
    'firstName' => 'Joe',
    'lastName'  => 'Smith'
    )
Run Code Online (Sandbox Code Playgroud)

我需要循环遍历数组中的每个元素,最后,数组应如下所示:

array(
    'FirstName' => 'Joe',
    'LastName'  => 'Smith'
    )
Run Code Online (Sandbox Code Playgroud)

失败的想法是:

    foreach($array as $key => $value)
    {
        $key = ucfirst($key);
    }
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为数组不是通过引用传递的.但是,所有这些尝试也都失败了:

    foreach(&$array as $key => $value)
    {
        $key = ucfirst($key);
    }


    foreach($array as &$key => $value)
    {
        $key = ucfirst($key);
    }
Run Code Online (Sandbox Code Playgroud)

我的智慧结束了这个.我正在使用Magento 1.9.0.1 CE,但这与此问题无关.如果你必须知道,我必须这样做的原因是因为我有一堆对象,我将作为一个数组返回组装到SOAP客户端.我正在使用的API要求键以大写字母开头...但是,我不希望将对象的变量名的第一个字母大写.傻,我知道,但我们都回答某人,并且有人想要这样.

php arrays foreach associative-array key

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

使用本机PHP功能比在PHP循环中做同样的事情更快吗?为什么?

这是我一直想知道的事情.当使用本机PHP函数而不是PHP循环等效时,性能总是更好吗?为什么或者为什么不?

以下两个例子来说明这个问题:

  • 假设我有一个包含1000个元素的大型数组.每个值只是一个整数用户ID.我想知道一个特定的用户标识是否在数组中,我碰巧知道它将朝向数组的末尾(因为它最近会被添加).我有两个选择:a)做一个foreach遍历整个数组的常规PHP 循环,直到找到用户ID,或者b)array_reverse()在数组上做一个并执行相同的foreach循环,直到找到id(如果它存在,它将结束这个循环更快).哪个更快?

我的直觉告诉我,第一个选项是更快,因为它做一个循环,而第二个选项是慢,因为在幕后,array_reverse()做某种类型的循环(C语言)的,因此需要两个循环的操作.

  • 如果我有一个大的多维数组,其中每个值都是[messageid,message],那么使用foreach循环来查找id的特定消息会比将messageid设置为元素的关键并且做的更慢isset(array[messageid]) && array[messageid]吗?

编辑:只是为了澄清,我知道第一个例子可以使用array_search(),因为这是一个非常简单的例子.主要的问题不是哪一个更快(因为基准可以让我很容易地知道),但为什么,如同在幕后发生的事情一样?

php performance foreach loops

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

在PHP中使用字符串(:)前缀数组键

快一点; 我知道一个解决方案,但如果它存在,我正在寻找更优雅的东西.

我正在使用PDO进行预先准备的声明:

$sql = "INSERT INTO my_table (foo, bar, baz) VALUES (:foo, :bar, :baz)";

$source->execute($sql, array(
    ':foo' => $foo,
    ':bar' => $bar,
    ':baz' => $baz,
));
Run Code Online (Sandbox Code Playgroud)

这很好,但我想传入一个先前创建的数组,但是包含的键没有冒号(:)的前缀,我认为必须有一个优雅的方式:

$array = array(
    'foo' => 'some',
    'bar' => 'random',
    'baz' => 'value',
);
Run Code Online (Sandbox Code Playgroud)

并将其翻译成:

$array = array(
    ':foo' => 'some',
    ':bar' => 'random',
    ':baz' => 'value',
);
Run Code Online (Sandbox Code Playgroud)

没有做:

$temp = array();
foreach($array as $key => $value){
    $temp[':' . $key] = $value;
}
$array = $temp;
Run Code Online (Sandbox Code Playgroud)

我浏览过PHP文档,但是我找不到适合此目的的函数(或序列).

有任何想法吗?


附录 …

php arrays key

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

在PHP中为每个数组键添加一个字符

可能重复:
为数组键添加前缀的最快方法?

我在PHP中有一个关于数组的快速问题.我需要为数组中的每个键添加几个字符,例如:

name =>标记年龄=> 23重量=> 150

需要转换为:

r_name => Mark r_age => 23 r_weight => 150

任何帮助将不胜感激,谢谢.

php arrays

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

替换php数组中的所有键

这是我的数组:

['apple']['some code'] 
['beta']['other code']
['cat']['other code 2 ']
Run Code Online (Sandbox Code Playgroud)

我怎样才能用“!”替换所有“e”字母 在键名中并保留值,这样我就会得到类似的东西

['appl!']['some code'] 
['b!ta']['other code']
['cat']['other code 2 ']
Run Code Online (Sandbox Code Playgroud)

我发现了这个,但因为所有键的名称不同,所以我无法使用它

$tags = array_map(function($tag) {
    return array(
        'name' => $tag['name'],
        'value' => $tag['url']
    );
}, $tags);
Run Code Online (Sandbox Code Playgroud)

php arrays

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

标签 统计

php ×6

arrays ×5

foreach ×3

key ×2

performance ×2

associative-array ×1

for-loop ×1

loops ×1