我怎样才能只为第一个函数调用做某事?
Posted
技术标签:
【中文标题】我怎样才能只为第一个函数调用做某事?【英文标题】:How can I do something only for the first function call? 【发布时间】:2015-11-27 20:13:21 【问题描述】:我正在使用以下代码从数组中丢失数据:
private function addIndexKey($parent)
$myKeys = array();
foreach ($parent->children as $child)
$pos = $child->varGet('flow_pos');
if (!isset($pos))
$pos = $child->position;
if (isset($child->index))
$myKeys["$pos"] = $child->index;
if (isset($child->children) && count($child->children)>0)
$subkeys = $this->addIndexKey($child);
if (count($subkeys)>0)
$myKeys["$pos"] = $subkeys;
ksort($myKeys);
return $myKeys;
我正在遍历一个数组,当我返回 $myKeys
数组时,有时会丢失数据。
我假设它是因为在第三个条件下再次调用相同的函数时重新定义了 $myKeys
数组。我希望函数的第一行在第一次调用函数时只执行一次。
有什么办法可以做到吗?
【问题讨论】:
我一直在努力解决这个问题,但还没有成功。如果我将其设为静态,我会得到值,但是当它循环大量时间时,我会得到非常大的数组,其中大部分是空的。有什么办法可以删除所有空索引并只保留那些有值的索引? 使用array_filter()
去掉空值,例如$myKeys = array_filter($myKeys);
【参考方案1】:
您可以用不同的方式归档它。我在这里只展示一些:
静态变量
使你的数组静态,所以初始化只在第一次函数调用时完成,例如
函数 addIndexKey($parent) 静态 $myKeys = array(); //只会初始化一次 //...
可选参数
使您的参数可选,并且不要在第一个函数调用时传递数组,例如
function addIndexKey($parent, $myKeys = []) //现在像这样调用函数:addIndexKey($parent, $myKeys) addIndexKey($parent)//第一次调用没有可选参数,这意味着它被初始化
(类属性)
由于您对函数有可见性,因此我假设您在一个类中,这意味着您可以使用 $myKeys
作为类属性,您可以使用空数组对其进行初始化,例如
类 XY 受保护的 $myKeys = []; 私有函数 addIndexKey($parent) //在这里使用'$this->myKeys'
【讨论】:
【参考方案2】:是的
$count = 0;
private function addIndexKey($parent)
global $count;
if(count == 0)
$myKeys = array();
$count++
...
【讨论】:
【参考方案3】:您可以在函数第一次运行时将变量设置为 false,并在函数内部检查是否为 true,然后运行第一行。
$isFirstTime = true;
function Your_function_name()
global $isFirstTime;
if ($isFirstTime)
//Run some code
$isFirstTime = false;
【讨论】:
【参考方案4】:检查 $myKeys 是否已经创建或者它是否是一个数组,这取决于您之前在代码中执行的操作,位于函数的第一行。
if( !is_array($myKeys) )$myKeys = array();
//OR EITHER
if( !isset($myKeys) )$myKeys = array();
【讨论】:
以上是关于我怎样才能只为第一个函数调用做某事?的主要内容,如果未能解决你的问题,请参考以下文章