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


unset an element in array_walk PHP

我使用array_walk遍历数组"sessions",每次都将数据($uid)发送到函数。

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

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

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仍然存在,没有从会话数组中删除。

我该如何存档?

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

您最好通过引用一个新的"handle_session"函数来传递整个$session,并遍历其中的$session数组。使用unset($session[$key])应该可以工作。

感谢@Bar-code告诉我,我不能以这种方式取消设置元素。

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

私有函数is_not_null_package($session){$package=$session["package"];$empty=(!isset($package)|| empty($packaging));return(!$empty);}//-处理会话array_walk($sessions,数组($this,'handle_each_session'),数组('uId'=>$uId));//-筛选会话//-删除所有包含空包的会话$sessions=array_filter($sessions,array($this,'is_not_null_package'));

它对我有效。