相关疑难解决方法(0)

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万
查看次数

为什么在引用值上调用函数(例如strlen,count等)这么慢?

我刚刚在PHP中发现了一些非常奇怪的东西.

如果我通过引用将变量传递给函数,然后在其上调用函数,那就非常慢.

如果循环遍历内部函数调用且变量很大,则它可能比通过值传递变量慢许多个数量级.

例:

<?php
function TestCount(&$aArray)
{
    $aArray = range(0, 100000);
    $fStartTime = microtime(true);

    for ($iIter = 0; $iIter < 1000; $iIter++)
    {
        $iCount = count($aArray);
    }

    $fTaken = microtime(true) - $fStartTime;

    print "took $fTaken seconds\n";
}

$aArray = array();
TestCount($aArray);
?>
Run Code Online (Sandbox Code Playgroud)

这在我的机器上运行大约需要20秒(在PHP 5.3上).

但是,如果我将函数更改为按值传递(即function TestCount($aArray)代替function TestCount(&$aArray)),则它会在大约2毫秒内运行 - 实际上要快10,000倍!

对于其他内置函数(例如strlen用户定义的函数)也是如此.

这是怎么回事?

php performance reference pass-by-reference

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

php数组引用传递给函数

我有一个问题,我无法找到答案.

我正在构建一个包含文件十六进制值的非常大的数组(比如$array[0]=B5 $array[1]=82等等$array[1230009])

当我创建一个函数来操纵该数组中的一些偏移并传递$arrayas(function parse(&$array) { ... })时,它比我传递数组normaly(function parse($array) { ... })需要更长的时间.

怎么可能?

PS:有没有更快的方法不使用阵列?只是使用$ string ="B5 82 00 1E ..etc",但我需要跟踪偏移量,因为我提前读取十六进制值,因为其中一些值包含长度"

php

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

PHP引用和性能

我读了一些关于PHP引用的文章以及它们如何影响性能.我也看到了一些测试,证明了相同.

大多数这些资源声称其原因是因为引用禁用了写时复制.

但我不明白为什么会导致问题?PHP不会复制数组,例如,因为您通过引用传递它.

function foo(&$var) {
    $var->test = 'bar';
    xdebug_debug_zval('var');
}

$data = new stdclass;
foo($data);
Run Code Online (Sandbox Code Playgroud)

结果我收到了

(refcount=3, is_ref=1),
object(stdClass)[1]
public 'test' => (refcount=1, is_ref=0),string 'bar' (length=3)
Run Code Online (Sandbox Code Playgroud)

这表明没有复制,并且该函数仍然使用相同的变量(处理实际变量而不是复制).

我错过了什么,为什么会有性能损失?

php performance php-5.5

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

在PHP中,通过引用传递大量数据而不是通过值传递资源是否更少(更聪明)?

可能重复:
在PHP(> = 5.0)中,更快地通过引用传递?

假设我正在处理一个大数据(有多大并不重要)数据数组并将其传递给函数.当然,它将通过值传递,而不是默认情况下通过引用传递.好的,我知道.

所以我的问题是:

如果存储在此数组中的数据足够大,则可以通过将数据存储在对象(例如,stdClass)中或通过使用foo(&$ myData)来获得有价值的性能或内存使用增益,以便通过引用传递数据而不是价值?

我的理解是,当它通过值传递时,PHP将创建一个全新的指针,指向数据的全新内存分配,而传递的值变量存在于函数范围中.在这种情况下,由于这个原因,可能通过引用传递大量数据是值得的吗?我不知道这种理解是否正确......这是问题的一部分.

注意:这是一个假设,所以不要提出任何关于"过早优化","你最好在最小化磁盘I/O然后再担心这个","取决于你有多少RAM","等等."

UPDATE

还有一个问题:假设数据被传递给一个对象构造函数,以便存储为该对象的一个​​属性,并且它会以一些小的方式被修改,因为它存储在新对象的属性中.那么操作的内存使用方面是否会有显着差异?假设最好以目标格式定义数据以避免因改变数据线而产生的成本,这是正确的吗?

php

4
推荐指数
2
解决办法
286
查看次数

从 PHP 的搜索字符串中删除停止词

我在优化 MySql 查询的搜索字符串时遇到了 PHP 函数的问题。

我需要通过搜索“the hobbit”来找到一个看起来像“hobbit, the”的条目。

我考虑过如果文章的搜索字符串中有尾随空格,则将其删除(在德国,我们有“der”、“die”和“das”)。

我的函数如下所示:

      public function optimizeSearchString($searchString)
      {
        $articles = [
          'der ',
          'die ',
          'das ',
          'the '
        ];
    
    
        foreach ($articles as $article) {
//only cut $article out of $searchString if its longer than the $article itself
          if (strlen($searchString) > strlen($article) && strpos($searchString, $article)) {
            $searchString = str_replace($article, '', $searchString);
            break;
          }
        }
    
        return $searchString;
      }
Run Code Online (Sandbox Code Playgroud)

但这不起作用...

也许使用正则表达式有更好的解决方案?

php

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

哪个是在函数范围之外引用变量的更好方法?

我可以$var通过以下两种方式之一更改我的函数:通过引用传递它或使用global关键字.

$var1 = 10;

function test1() {
    global $var1;
    $var1++;
}

function test2(&$var) {
    $var++;
}
Run Code Online (Sandbox Code Playgroud)

两种方法都有相同的结果,但它们之间有什么区别吗?哪一个更受欢迎哪一个更快?

php pass-by-reference

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

通过引用传递一个字符串函数会加快速度吗?(PHP)

可能重复:
在PHP(> = 5.0)中,更快地通过引用传递?

我想知道是否通过引用声明参数传递,PHP解释器将更快,因为不必将字符串复制到函数的本地范围?该脚本将XML文件转换为CSV,其中包含数千条记录,因此很少有时间优化.

这会是:


function escapeCSV( & $string )
{
    $string = str_replace( '"', '""', $string ); // escape every " with ""
    if( strpos( $string, ',' ) !== false )
        $string = '"'.$string.'"'; // if a field has a comma, enclose it with dobule quotes
    return $string;
}
Run Code Online (Sandbox Code Playgroud)

要快于此:


function escapeCSV( $string )
{
    $string = str_replace( '"', '""', $string ); // escape every " with ""
    if( strpos( $string, ',' ) !== false )
        $string = …
Run Code Online (Sandbox Code Playgroud)

php optimization function pass-by-reference premature-optimization

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

递归 ksort :不对数组进行排序

我有一个问题所以我有这个数组:

Array
(
[2016] => Array
    (
        [23] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )

        [22] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )

        [21] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )

        [20] => Array
            (
                [total_auctions] => 0
                [total_price] => 0
            )
)
Run Code Online (Sandbox Code Playgroud)

我想按键对递归进行排序。所以我创建了方法:

 public function sortNestedArrayAssoc($a)
{
    if (!is_array($a)) {
        return false;
    }
    ksort($a);
    foreach ($a as $k=>$v) {
        $this->sortNestedArrayAssoc($a[$k]);
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了相同的结果,带有键的数组23是第一个,我真的不明白问题出在哪里。你能帮我吗 ?提前感谢并为我的英语感到抱歉

php ksort php-5.3 php-5.5

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