对结构化PHP变量的声明式访问,无需foreach循环

对结构化PHP变量的声明式访问,无需foreach循环,php,data-structures,variables,Php,Data Structures,Variables,背景 假设我在PHP中有以下嵌套变量 $data = Array( Array('lname' => 'Simpson','fname' => 'Homer','age' => '35','motto' => '_blank_'), Array('lname' => 'Simpson','fname' => 'Marge','age' => '34','motto' => '_blank_'), Array(

背景

假设我在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循环有什么特别的原因吗?如果只是为了简洁起见,您可以自己声明函数,这相当简单:

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
这使您可以根据数组中的键/值对获取记录。注意,构造函数中的类型暗示是PHP5.3(?)


顺便说一句,不,没有办法逃脱
foreach
,因为即使是内部PHP函数(任何以
array\uuu
开头的函数)也使用
foreach
或其他类型的循环。但是,如果您将循环封装到一个类中,您就不必考虑它。

如果您真的想过度使用所有东西,您可以尝试使用神奇的方法

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

如果没有,你可以自己做!任何像这样存在的函数都会使用foreach循环,无论如何,你最好使用foreach循环编写自己的框架,而不是在互联网上搜索不存在的东西。我自己已经做过了,我不是唯一有这个想法的人。问题是看看其他人是如何做到这一点的。另请参见:
$p = new Simpsons($data); // Stored in the format provided

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