【问题标题】:Holding Array of Values with Codeigniter ruri_to_assoc()使用 Codeigniter ruri_to_assoc() 保存值数组
【发布时间】:2015-02-12 13:56:14
【问题描述】:

我正在构建一个库,它将使用 URI 来定义一组过滤器设置。 Codeingiter 的 ruri_to_assoc() 对我的大多数设置都很有效,因为它们就像 key=>value 一样简单。但是,一个值(标签)可以包含多个我希望匹配的值。

当 ruri_to_assoc() 使用键/值配对时,我如何将数组设置为 url 中的键?示例:

/days/365/order/oldest/tag/car/tag/red/tag/mustang

目前,看来我将不得不自己分解 uri_string() 并循环遍历它。像这样:

$test_fil = explode('/',$this->uri->uri_string());
        unset($test_fil[0]);
        $val = 'key';
        foreach($test_fil as $fkey=>$fval){
            if($fval=='tags'){
                $val = 'tag';
                $new_filter['tags'] = '';
            }
            else{
                if($val == 'key'){
                    $new_filter[$fval] = '';
                    $val = 'val';
                    $current_key = $fval;
                }
                elseif($val == 'val'){
                    $new_filter[$current_key] = $fval;
                    $val = 'key';
                }
                else{
                    $new_filter['tags'][] = $fval;
                }

            }
        }

CI 中有什么东西可以为我做到这一点吗?感谢您的帮助!

【问题讨论】:

  • 你如何创建你的网址/days/365/order/oldest/tag/car/tag/red/tag/mustang
  • @Simo 我不太明白你的意思。这是我们决定使用的 URL 样式。我们有一个带有方法的控制器,然后我们调用 ruri_to_assoc() 来分配键/值对。
  • 我的意思是:如果你可以像这样使用标签作为数组来更改你的网址:/days/365/order/oldest/tag[]/car/tag[]/red/tag[]/mustang
  • @Simo 虽然我可以随意更改我的网址,但括号并不是最用户友好的。此外,看起来 CI 不喜欢 url 中的它们。
  • 你只是想合并所有由 ruri_to_assoc() 生成的名为 "tag" 的键,对吧?

标签: php codeigniter url codeigniter-2


【解决方案1】:

我们只需要确保 uri_to_assoc 在构建数组时不会覆盖已经存在的键。

application/core 中创建 MY_URI.php

class MY_URI extends CI_URI
{
    protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment')
    {
        if ( ! is_numeric($n))
        {
            return $default;
        }

        if (isset($this->keyval[$which], $this->keyval[$which][$n]))
        {
            return $this->keyval[$which][$n];
        }

        $total_segments = "total_{$which}s";
        $segment_array = "{$which}_array";

        if ($this->$total_segments() < $n)
        {
            return (count($default) === 0)
                ? array()
                : array_fill_keys($default, NULL);
        }

        $segments = array_slice($this->$segment_array(), ($n - 1));
        $i = 0;
        $lastval = '';
        $retval = array();

        foreach ($segments as $seg)
        {
            /*HERE IS THE PART WE TRULY OVERRIDE*/
            if ($i % 2)
            {
                if(is_array($retval[$lastval]))
                    $retval[$lastval][] = $seg;
                else
                    $retval[$lastval] = $seg;
            }
            else
            {
                if(isset($retval[$seg]) && !is_array($retval[$seg]))
                {
                    $tmp = $retval[$seg];
                    $retval[$seg] = array();
                    $retval[$seg][] = $tmp;
                }   
                else if(!isset($retval[$seg]))
                {
                    $retval[$seg] = NULL;
                    $lastval = $seg;
                }
            }
            /*END OVERRIDE*/

            $i++;
        }

        if (count($default) > 0)
        {
            foreach ($default as $val)
            {
                if ( ! array_key_exists($val, $retval))
                {
                    $retval[$val] = NULL;
                }
            }
        }

        // Cache the array for reuse
        isset($this->keyval[$which]) OR $this->keyval[$which] = array();
        $this->keyval[$which][$n] = $retval;
        return $retval;
    }
}

然后在您的控制器中,没有任何变化:

$myTags = $this->uri->uri_to_assoc();

这是我测试后得到的:

array (size=3)
  'days' => string '365' (length=3)
  'order' => string 'oldest' (length=6)
  'tag' => 
    array (size=3)
      0 => string 'car' (length=3)
      1 => string 'red' (length=3)
      2 => string 'mustang' (length=7)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多