Декларативный доступ к структурированной переменной PHP без циклов foreach - PullRequest
2 голосов
/ 29 января 2010

Фон

Предположим, у меня есть следующая вложенная переменная в 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

Ответы [ 3 ]

4 голосов
/ 29 января 2010

Если вы действительно хотите перебить все, вы можете попробовать подход магическими методами!

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
1 голос
/ 29 января 2010
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 или какой-либо другой тип цикла. Однако, если вы инкапсулируете цикл в класс, вам не нужно об этом думать.

1 голос
/ 29 января 2010

Есть ли конкретная причина, по которой вы не хотите использовать циклы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...