【问题标题】:How to unset session data by page number upto n pages in Codeigniter?如何在 Codeigniter 中按页码最多 n 页取消设置会话数据?
【发布时间】:2015-02-17 07:25:06
【问题描述】:
$this->session->unset_userdata('current_page_'.$pagenumber);

通过使用此代码,我正在取消会话中每个页码的数据,但问题是在某些时候我不知道会话中存在多少页数据,例如:

$this->session->unset_userdata('current_page_'.1);
$this->session->unset_userdata('current_page_'.2);
$this->session->unset_userdata('current_page_'.3);
$this->session->unset_userdata('current_page_'.4);
.
.
.
$this->session->unset_userdata('current_page_'.?????);

有没有办法从会话中取消设置数据,其中键如“current_page_%” 提前致谢。

【问题讨论】:

  • 使用current_page作为名称,然后只在会话中存储实际页码不是更好吗? $this->session->set_userdata('current_page', $page_no);
  • 在 $page_no 中会是 b 数组吗?
  • 我不确定我是否理解你想要做什么,如果是数组,你总是可以先序列化数据:$this->session->set_userdata('current_page', serialize($array));

标签: php codeigniter session


【解决方案1】:

您可以尝试搜索会话的首字母(即current_page_)并相应地取消设置。

<?php
function startsWith($haystack, $needle) {
    // search backwards starting from haystack length characters from the end
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
}

foreach($this->session->all_userdata() as $key => $value)
{
    if(startsWith($key, 'current_page_'))
        $this->session->unset_userdata($key);
}


例如:

<?php
function startsWith($haystack, $needle) {
    // search backwards starting from haystack length characters from the end
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
}

$session = array(
            'current_page_12' => 'abc', 
            'current_page_qw1' => 'xyz', 
            'hello' => 'world', 
            'current_page_23d' => 'mno', 
            'example' => '112'
        );

foreach($session as $key => $value)
{
    if(startsWith($key, 'current_page_'))
        unset($session[$key]);
}

print_r($session);


输出:

Array
(
    [hello] => world
    [example] => 112
)


演示:
http://3v4l.org/uh4HK

【讨论】:

    【解决方案2】:

    试试这个

    $j = 1;
    for($i=0;$i==$j;$i++)
    {
        if($this->session->userdata('current_page_'.$i))
        {
            $this->session->unset_userdata('current_page_'.$i);
            $j++;
        }else
        {
            break;
        }
    }
    

    【讨论】:

    • 这里有问题,因为我不知道存在哪个页码,例如
    • 好的,你应该使用数组而不是这样做 current_page_1, current_page_2 等你应该使用 current_page[1],current_page[2] 等。
    【解决方案3】:

    此语句将打印所有会话数据,您可以从中获取所有页码。

    print_r($this->session->all_userdata());

    【讨论】:

      【解决方案4】:

      这应该适合你:

      (这里我只是使用preg_grep() 来获取遵循模式的所有数组元素。为了匹配键而不是值,我使用array_keys() 来获取所有键。然后我只需使用foreach 循环遍历匹配项循环并取消设置数组元素)

      <?php
      
      
          //As an example v Here just use your array
          $array = array("current_page_1" => 1, "current_page_1345" => 2, "current_page_12" => 3, "current_page_34" => 4, "xy" => 5, "z" => 6);
          $sub = preg_grep("/(current_page_)\d+/", array_keys($array));
      
          foreach($sub as $v)
              unset($array[$v]);  //$this->session->unset_userdata($v);
      
          print_r($array);
      
      ?>
      

      输出:

      Array ( [xy] => 5 [z] => 6 )
      

      【讨论】:

      • 那需要多长时间?
      • @pakistanimoon 你说的需要多少时间是什么意思?比如脚本必须执行多长时间?
      • 我只是希望它比这里其他用户提供的其他解决方案更快?
      • @pakistanimoon 我刚刚将我的答案与这个答案进行了比较:stackoverflow.com/a/28556912/3933332 两者在 10k 数组元素中的速度几乎相同。在 0.02 - 0.03 秒之间执行。只需选择您认为对您最有帮助并解决您的问题的答案和脚本
      猜你喜欢
      • 1970-01-01
      • 2020-12-16
      • 2017-01-06
      • 2011-12-13
      • 2014-01-03
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多