2013-04-09 2 views
0

Я сравниваю результаты двух взорванных строк (результаты запроса), хотя, когда я использую array_intersect для поиска перекрытия массивов, я, к сожалению, получаю только перекрытие этих теги, которые приходят первые в каждом массиве ... например, если два массива выглядеть следующим образом:Проблема сравнения двух разросшихся php-массивов, чтобы найти перекрытие

Array1:

array(
    [0]=> tag_a 
    [1]=> tag_b 
) 

array2:

array(
    [0]=> tag_a 
    [1]=> tag_b 
) 

array_intersect является ОНЛ y возвращает tag_a в матче. Я ожидал, что поведение array_intersect вернет tag_a, а также tab_b.

Как вы можете видеть позже в моем коде, я использую совпадения (теги, присутствующие в обоих массивах), чтобы построить массив contactarray. Я могу построить массив OK, он просто не содержит значений, которые я ожидал бы (например: tag_b).

EDIT Я запустил несколько тестов, распечатанных contactarray, и применил различные теги к этим контактам, и только те контакты, у которых есть tag_a сперва (в массиве), возвращаются, хотя у нескольких других контактов есть tag_a, хотя это просто не первый в массиве. Мысли?

if ($frequency == 'Weekly') 
{ 
    $data['query_tag'] = $this->db->get('tags'); 

    foreach ($data['query_tag']->result() as $row2) 
    { 
    $contact_tags = $row2->tags; 
    $contact_tags_exploded = explode(",", $contact_tags); 

    $rule_tags_exploded = explode(",", $rule_tags); 
    $result = array_intersect($rule_tags_exploded, $contact_tags_exploded); 

    if(isset($result) && count($result) != 0){ 
     $contactarray[] = $row2->contact_name; 
    } 
    } 
} 
+0

Вы проверяете, установлен ли параметр 'array_intersect' и содержит более 0 элементов. Помимо этого вы ничего не делаете с этим ... Я предполагаю, что 'tag_b' там, вы просто не используете его. – Mischa

+0

Извините, прочитав мое сообщение снова, я был не очень ясен .... Чтобы предоставить больше контекста, я запустил несколько тестов, распечатанных contactarray, и применил различные теги к этим контактам, и только те контакты, у которых есть tag_a в первую очередь (в массиве), хотя несколько других контактов имеют tag_a, хотя это просто не первое в массиве. – mhawk

+0

@ Миша, ты действительно обратил внимание, переформатировав свой код, ты бы заметил знак '' ', который я случайно удалил. –

ответ

1

Try array_uintersect()

Здесь $ arr1 ваш первый массив и $ arr2 является вторым массивом

$intersect = array_uintersect($arr1, $arr2, 'compareDeepValue'); 
print_r($intersect); 

function compareDeepValue($val1, $val2) 
{ 
    return strcmp($val1['value'], $val2['value']); 
} 

Это должно дать вам как значения

+0

Да, я видел это в другом потоке, хотя, когда я пытаюсь это сделать, я получаю это сообщение об ошибке: Сообщение: array_uintersect() [function.array-uintersect]: Недействительный обратный вызов compareDeepValue – mhawk

+0

Попробуйте определить функцию compareDeepValue над $ intersect = array_uintersect ($ arr1, $ arr2, 'compareDeepValue'); –

+0

Работал! Спасибо за вашу помощь! – mhawk

0

Не уверен, где проблема, с которой вы сталкиваетесь, скопируйте этот код, и вы увидите эти два значения правильно.

$arr = array('tag_a','tab_b '); 

$arr = array('tag_a','tab_b '); 
print_r(array_intersect($arr, $arr)); 
+0

Извините, прочитав мое сообщение снова, я был не очень ясен .... Чтобы предоставить больше контекста, я запустил несколько тестов, распечатанных contactarray, и применил различные теги к этим контактам и ** только ** контакты, которые имеют сначала возвращаются tag_a (в массиве), хотя несколько других контактов имеют tag_a, хотя это просто не первое в массиве. – mhawk

0

использования мастер-массив для первый аргумент и массив для сравнения в качестве второго аргумента. Я не уверен, какая у вас проблема.