对结构化PHP变量的声明式访问,无需foreach循环
背景 假设我在PHP中有以下嵌套变量对结构化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(
$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