【问题标题】:Declarative access to structured PHP variable without foreach loops无需 foreach 循环即可对结构化 PHP 变量进行声明式访问
【发布时间】:2010-01-29 11:38:16
【问题描述】:

背景

假设我在 PHP 中有以下嵌套变量。

$data = Array(
Array('lname'  =>  'Simpson','fname'  =>  'Homer','age'    =>  '35','motto'  =>  '_blank_'),
Array('lname'  =>  'Simpson','fname'  =>  'Marge','age'    =>  '34','motto'  =>  '_blank_'),
Array('lname'  =>  'Flintstone','fname'  =>  'Fred','age'    =>  '33','motto'  =>  '_blank_'),
Array('lname'  =>  'Flintstone','fname'  =>  'Wilma','age'    =>  '29','motto'  =>  '_blank_')
);

还假设访问特定值的标准方法:

print($data[0]['fname']);  // Homer
print($data[1]['age']);    // 34

问题

是否有现有的库或框架可以让我轻松地 以声明方式访问特定值,而不使用 foreach 循环?

$test = $data->get_record_by_fname['Homer']
print $test['age'] //35

【问题讨论】:

  • 如果没有,您可以自己制作!
  • 任何这样存在的函数无论如何都会使用 foreach 循环,与在互联网上搜索不存在的东西相比,使用 foreach 循环编写自己的框架要好得多。跨度>
  • 我自己已经做过了,而且我不是唯一一个有这个想法的人。问题是看看其他人是怎么做到的。

标签: php data-structures variables


【解决方案1】:

如果你真的想把所有东西都杀了,你可以尝试一种使用神奇方法的方法!

class Simpsons
{
    protected $_data = array();

    public function __construct(array $data)
    {
        $this->_data = array_map(function ($i) { return (object)$i; }, $data);
    }

    public function __call($method, $args)
    {
        if (count($args) == 0)
            return NULL;

        foreach ($this->_data as $row)
        {
            if (property_exists($row, $method) && $row->$method == $args[0])
            {
                return $row;
            }
        }

        return NULL;
    }
}

用法:

$p = new Simpsons($data); // Stored in the format provided

var_dump($p->fname('Homer')); // Gets the record with fname = Homer

【讨论】:

【解决方案2】:

您是否有不想使用 foreach 循环的特殊原因?如果只是为了简洁,你可以自己声明函数,这很简单:

function get_record($set, $field, $value) {
    foreach($set as $key => $val) {
        if($val[$field] === $value) return $set[$key];
    }
    return NULL;
}

那么你的例子会变成:

$test = get_record($data, 'fname', 'Homer');
print $test['age']; //35

【讨论】:

    【解决方案3】:
    class SomeClass{
    
        // Stores the Array of Data
        public $data;
    
        // Sets up the object. Only accepts arrays
        public function __construct(array $data)
        {
            $this->data = $data;
        }
    
        // Gets a record based on the key/value pair
        public function getByKey($key, $value)
        {
            foreach($this->data as $array)
            {
                    if(is_array($array)
                    {
                        if(array_key_exists($key, $array) && $array[$key] == $value)
                        {
                            return $array;
                        }
                     }
            }
        }
    
    }
    
    $array = array( 1 => array("Test" => "Hello"));
    $obj = new SomeClass($array);
    
    $record = $obj->getByKey('Test', 'Hello');
    

    这使您可以根据数组中的键/值对获得记录。注意,构造函数中的类型提示是 PHP 5.3(?)

    顺便说一句,不,没有办法逃避 foreach,因为即使是内部 PHP 函数(任何以 array_ 开头的函数)都使用 foreach 或其他类型的循环。但是,如果将循环封装到一个类中,则无需考虑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多