在array_walk PHP中取消设置一个元素

时间:2015-11-17 09:00:58

标签: php arrays

我使用array_walk遍历一个数组“sessions”,每次都将我的数据($ uid)发送给该函数。

$uid = ...;

array_walk($sessions, array($this,'handle_each_session'), array('uid' => $uid));

在函数'handle_each_session'中,还有另一个变量$package。如果$package为空,我将取消设置元素(从数组中删除元素),否则我会将$packag e放入元素中。

private function handle_each_session (& $s, $k, $data)
{
   $uid = $data['uid'];
   $s['uid'] = $uid;
   $package = $this->get_random_package($uid);

   //- if $package is not defined, then unset the element
   if (!isset($package) || empty($package))
   {
       unset($s);
       return;
   }

   //- otherwise put the package into the element
   $s['package'] = $package;
}

结果是元素$s仍然存在,不会从会话数组中删除。

我如何存档?

2 个答案:

答案 0 :(得分:1)

你不能这样做。 Unset($ s)不会破坏通过引用传递的$ session var。它破坏了$ s和$ session之间的联系。请参阅此处的文档 http://php.net/manual/en/language.references.unset.php

你最好通过引用一个新的" handle_session"来传递整个$ session。函数并通过其中的$ session数组。 使用unset($ session [$ key])应该有效。

答案 1 :(得分:0)

感谢@ Bar-code让我知道,我无法以这种方式解开元素。

我使用array_filter删除所有带有空包的元素,如下所示:


private function is_not_null_package($session)
{
        $package = $session['package'];
        $empty = (!isset($package) || empty($package));
        return (!$empty);
}

//- handle sessions
array_walk($sessions, array($this,'handle_each_session'), array('uId' => $uid));

//- filter sessions
//- remove all sessions with empty packages
$sessions = array_filter($sessions, array($this, 'is_not_null_package') );

它对我有用。