2013-02-28 41 views
5

parametresini almak için func_get_args işlevini kullanan bir işleve geçirirseniz, değişken sayıda bağımsız değişken kabul eden bir API yöntemine programlama yapıyorum. API yöntemi (aşağıya bakınız) func_get_args kullanır. API'yi paketliyorum ve dizinin anahtarlarını/değerlerini parametre olarak geçirmektense bir ilişkisel dizi iletebilmek istiyorum; filter(key1,value1,key2,value2 ...)Nasıl Yapılır Bir diziyi

API'ye kaynak kod erişimim var ancak maalesef kaynağı değiştiremiyorum.
call_user_func_array'a baktım, ki bir diziyi bir dizi argüman olarak (ilişkisel bir dizi olmasa da) geçirmeli/geçireceğime inanıyorum. filter bir nesnenin bir yöntemidir - bir yöntemi geri arama olarak nasıl geçeceğimi bilmiyorum. Ayrıca bu API'yi paketlemek için temiz bir yol olup olmadığını bilmiyorum. Her türlü yardım takdir edilir.

function wrapper(array $params) { 
    $flat = array(); 
    foreach ($params as $k => $v) { 
     $flat[] = $k; 
     $flat[] = $v; 
    } 

    return call_user_func_array('filter', $flat); 
} 

yukarıdaki filter sizin durumunuzda doğru değildir ücretsiz işlevi olduğunu varsayar:

<?php 

public function &filter() { 
     $filter = new QueryFilter($this->queryhandler, $this); 
     $args = func_get_args(); 
     $filter->applyFilter($this->getFilters($args)); 
     return $filter; 
    } 
+0

'key1',' key2' vb. 'func_get_args', anahtarların önceden belirlendiği sayısal olarak dizilmiş bir dizi sağlar. – Jon

+0

Şimdi mantıklı. Bir cevap eklendi. – Jon

+0

'filter' işlevi veritabanı alan adlarını ve alan değerlerini alır. Bu yüzden ilişkisel bir dizi kullanmayı tercih ederim. İlişkisel dizinin manipüle edilmesi gerekir, böylece anahtarlar ve değerler ilişkisel olmayan bir dizide olur, örneğin dizi alır ('key1' => 'value1', 'key2' => 'value2') ve dizi yapar ('key1', Yapabileceğim 'value1', 'key2', 'value2' ..), ancak yöntemin bir geriçağırım işlevi olarak nasıl geçeceğinden emin değilim. Call_user_func_array bunu yapmak için doğru yol olup olmadığından emin değilim. –

cevap

4

Bir dizi alır ve bir sarmalayıcı olabilir anahtarları ve değerleri "düzleştirir" . Bir yöntemi geri arama olarak belirtmek için, $object'da filter yöntemini çağırmak üzere array($object, 'filter') sözdizimini call_user_func_array ile birlikte kullanın.