我是多维数组中的新手,这让我很烦恼.
我的数组如下:
$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中发现了一些非常奇怪的东西.
如果我通过引用将变量传递给函数,然后在其上调用函数,那就非常慢.
如果循环遍历内部函数调用且变量很大,则它可能比通过值传递变量慢许多个数量级.
例:
<?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用户定义的函数)也是如此.
这是怎么回事?
我有一个问题,我无法找到答案.
我正在构建一个包含文件十六进制值的非常大的数组(比如$array[0]=B5 $array[1]=82等等$array[1230009])
当我创建一个函数来操纵该数组中的一些偏移并传递$arrayas(function parse(&$array) { ... })时,它比我传递数组normaly(function parse($array) { ... })需要更长的时间.
怎么可能?
PS:有没有更快的方法不使用阵列?只是使用$ string ="B5 82 00 1E ..etc",但我需要跟踪偏移量,因为我提前读取十六进制值,因为其中一些值包含长度"
我读了一些关于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)
这表明没有复制,并且该函数仍然使用相同的变量(处理实际变量而不是复制).
我错过了什么,为什么会有性能损失?
假设我正在处理一个大数据(有多大并不重要)数据数组并将其传递给函数.当然,它将通过值传递,而不是默认情况下通过引用传递.好的,我知道.
所以我的问题是:
如果存储在此数组中的数据足够大,则可以通过将数据存储在对象(例如,stdClass)中或通过使用foo(&$ myData)来获得有价值的性能或内存使用增益,以便通过引用传递数据而不是价值?
我的理解是,当它通过值传递时,PHP将创建一个全新的指针,指向数据的全新内存分配,而传递的值变量存在于函数范围中.在这种情况下,由于这个原因,可能通过引用传递大量数据是值得的吗?我不知道这种理解是否正确......这是问题的一部分.
注意:这是一个假设,所以不要提出任何关于"过早优化","你最好在最小化磁盘I/O然后再担心这个","取决于你有多少RAM","等等."
UPDATE
还有一个问题:假设数据被传递给一个对象构造函数,以便存储为该对象的一个属性,并且它会以一些小的方式被修改,因为它存储在新对象的属性中.那么操作的内存使用方面是否会有显着差异?假设最好以目标格式定义数据以避免因改变数据线而产生的成本,这是正确的吗?
我在优化 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)
但这不起作用...
也许使用正则表达式有更好的解决方案?
我可以$var通过以下两种方式之一更改我的函数:通过引用传递它或使用global关键字.
$var1 = 10;
function test1() {
global $var1;
$var1++;
}
function test2(&$var) {
$var++;
}
Run Code Online (Sandbox Code Playgroud)
两种方法都有相同的结果,但它们之间有什么区别吗?哪一个更受欢迎哪一个更快?
我想知道是否通过引用声明参数传递,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
我有一个问题所以我有这个数组:
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 ×9
performance ×2
php-5.5 ×2
arrays ×1
foreach ×1
function ×1
ksort ×1
optimization ×1
php-5.3 ×1
reference ×1