我怎样才能只为第一个函数调用做某事?

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();

【讨论】:

以上是关于我怎样才能只为第一个函数调用做某事?的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特:我怎样才能在完成体内调用我的函数?

我怎样才能重新调用这个函数?没有经验的ES6

如何只为偶像用户做会话超时?

查找函数调用的起源

如何找到调用某个函数的地方?

斯威夫特:我怎样才能减少 didupdatelocation 调用