【问题标题】: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);

标签: php arrays function logic


【解决方案1】:

您可以用不同的方式归档它。我在这里只展示一些:

  1. 静态变量

    使你的数组​​静态,所以初始化只在第一次函数调用时完成,例如

    函数 addIndexKey($parent) {
    静态 $myKeys = array(); //只会初始化一次
    //...
    }
    
  2. 可选参数

    使您的参数可选,并且不要在第一个函数调用时传递数组,例如

    function addIndexKey($parent, $myKeys = []) {
    //现在像这样调用函数:addIndexKey($parent, $myKeys)
    }
    addIndexKey($parent)//第一次调用没有可选参数,这意味着它被初始化
    
  3. (类属性)

    由于您对函数有可见性,因此我假设您在一个类中,这意味着您可以使用 $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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 2019-09-01
          • 2020-05-24
          • 2011-01-16
          • 2018-07-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多