Foreach döngüsünden olmadan yapılandırılmış PHP değişkeni Bildirimsel erişim

3 Cevap php

Background

Ben PHP Aşağıdaki yuvalanmış değişkeni olduğunu varsayalım.

$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_')
);

Ayrıca belirli değerlere erişim için standart yöntemler varsayalım:

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

Question

Is there an existing library or framework that would allow me to easily acess specific values declaratively, without using foreach loops?

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

3 Cevap

Eğer gerçekten her şeyi overkill istiyorsa, büyülü yöntemleri kullanarak bir yaklaşım deneyebilirsiniz!

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;
    }
}

Kullanımı:

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

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

Eğer foreach döngüleri kullanmak istemiyorsanız belirli bir nedeni var mı? Bu kısalık için sadece eğer, sadece bu oldukça önemsiz olduğunu, işlevini kendiniz bildirebilirsiniz:

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

Sonra örnek olacak:

$test = get_record($data, 'fname', 'Homer');
print $test['age']; //35
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');

Bu dizi bir anahtar / değer çifti ne dayalı bir kayıt yapmanıza olanak sağlıyor. Not, yapıcı tip ima PHP 5.3 (?)

BTW, Hayır, (ile başlayan bir şey array_), bir foreach veya döngü diğer bazı türünü kullanır foreach hatta iç PHP fonksiyonları olarak kaçmak için bir yol yoktur . Eğer bir sınıfa döngü saklanması Ancak, bunu düşünmek zorunda değilsiniz.