2013-05-07 1 views
1

У меня есть функция, как это:Проверьте все параметры для данной функции принадлежат к одному классу

// merge - merge two or more given trees and returns the resulting tree 
function merge() { 
    if ($arguments = func_get_args()) { 
     $count = func_num_args(); 

     // and here goes the tricky part... :P 
    } 
} 

я могу проверить, если все приведенные аргументы относятся к одному типу/классу (класс, в этом случае), используя такие функции, как get_class(), is_*() или даже ctype_*(), но это работает (насколько я понимаю) на уровне одного элемента.

Что бы я хотел сделать, это нечто похожее на функцию in_array(), но сравнение класса всех элементов в массиве, поэтому я бы сделал что-то вроде in_class($class, $arguments, true).

я мог бы сделать что-то вроде этого:

$check = true; 

foreach ($arguments as $argument) { 
    $check &= (get_class($argument) === "Helpers\\Structures\\Tree\\Root" ? true : false); 
} 

if ($check) { 
    // continue with the function execution 
} 

Так что мой вопрос ... есть определенная функция для этого? Или, по крайней мере, лучший/более элегантный способ сделать это?

+0

get_object_vars или get_class_vars возможно? http://php.net/manual/en/function.get-object-vars.php –

+0

Что именно вы хотите сделать? – NullPointer

+0

Нет, мне нужно получить имя класса для каждого аргумента и выполнить проверку против него. Эти два метода будут раскрывать каждое свойство аргумента ('$ attributes' в моем случае), но это не сработает: P –

ответ

1

Чтобы применить функцию к каждому элементу, вы можете использовать array_reduce(...). Если ваша цель - написать однострочный, вы также можете использовать create_function(...).

Пример array_reduce

<?php 
    class foo { } 
    class bar { } 

    $dataA = array(new foo(), new foo(), new foo()); 
    $dataB = array(new foo(), new foo(), new bar()); 

    $resA = array_reduce($dataA, create_function('$a,$b', 'return $a && (get_class($b) === "foo");'), true); 
    $resB = array_reduce($dataB, create_function('$a,$b', 'return $a && (get_class($b) === "foo");'), true); 

    print($resA ? 'true' : 'false'); // true 
    print($resB ? 'true' : 'false'); // false, due to the third element bar. 
?> 
+0

Работал как шарм. Большое спасибо! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^