2010-01-29 98 views
2

背景声明访问结构化的PHP变量没有foreach循环

假设我在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 
+0

如果不是这样,你总是可以让你自己! – 2010-01-29 03:23:18

+0

任何可能存在的函数无论如何都会使用foreach循环,但使用foreach循环编写自己的框架比搜索互联网找不到的东西要好得多。 – animuson 2010-01-29 03:28:41

+0

我已经自己做过了,而且我不是唯一有此想法的人。问题是看看其他人是如何做到的。 – dreftymac 2010-01-29 03:53:20

回答

4

如果你真的想过度使用一切,你可以尝试使用神奇的方法!

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 
+0

这很有趣... – 2010-01-29 03:42:25

+1

另请参阅:http://stackoverflow.com/questions/76328/is-there-a-way-to-emulate-php5s-call-magic-method -in-PHP4 – dreftymac 2010-01-29 04:11:54

1

是否有你不想使用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 
+0

你打败了我:( – 2010-01-29 03:25:45

1
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(?)

BTW,没有,没有办法逃脱foreach因为即使内部PHP函数(任何开头array_)使用foreach或一些其他类型的循环。但是,如果将循环封装到类中,则不必考虑它。