2012-01-02 2 views
0

Я провел во второй половине дня, пытаясь решить этот вопрос:Matching два элемента массива в PHP

Как я могу проверить, если {с, до} элементов в этом массиве одинаковы? В словах: мне нужно знать, как сопоставить элементы массива в рекурсивной функции.

Пример

Этот массив должен возвращать FALSE, потому что $ массив [4] [0] [ 'от'] и $ массив [4] [0] [ 'до'] не то же самое во всех массивах $ array [2] и $ array [3].

Array 
(
    [4] => Array 
     (
      [0] => Array 
       (
        [from] => 1 
        [to] => 2.0000 
        [price] => 8.0000 
       ) 

      [1] => Array 
       (
        [from] => 2.0000 
        [to] => 4.0000 
        [price] => 6.0000 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [from] => 1 
        [to] => 3.0000 
        [price] => 70.0000 
       ) 

      [1] => Array 
       (
        [from] => 3.0000 
        [to] => 5.0000 
        [price] => 60.0000 
       ) 

      [2] => Array 
       (
        [from] => 5.0000 
        [to] => 9.0000 
        [price] => 50.0000 
       ) 

     ) 

    [3] => Array 
     (
      [0] => Array 
       (
        [from] => 1 
        [to] => 2.0000 
        [price] => 25.0000 
       ) 

      [1] => Array 
       (
        [from] => 2.0000 
        [to] => 4.0000 
        [price] => 20.0000 
       ) 

      [2] => Array 
       (
        [from] => 4.0000 
        [to] => 6.0000 
        [price] => 15.0000 
       ) 

     ) 

) 

Этот массив должен вернуть TRUE, потому что $ массив [4] [0] [ 'от'] и $ массив [4] [0] [ 'к'] то же самое во всех $ array [2] и $ array [3].

Array 
(
    [4] => Array 
     (
      [0] => Array 
       (
        [from] => 1 
        [to] => 3.0000 
        [price] => 7.0000 
       ) 

      [1] => Array 
       (
        [from] => 3.0000 
        [to] => 5.0000 
        [price] => 6.0000 
       ) 

      [2] => Array 
       (
        [from] => 5.0000 
        [to] => 9.0000 
        [price] => 5.0000 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [from] => 1 
        [to] => 3.0000 
        [price] => 70.0000 
       ) 

      [1] => Array 
       (
        [from] => 3.0000 
        [to] => 5.0000 
        [price] => 60.0000 
       ) 

      [2] => Array 
       (
        [from] => 5.0000 
        [to] => 9.0000 
        [price] => 50.0000 
       ) 

     ) 

    [3] => Array 
     (
      [0] => Array 
       (
        [from] => 1 
        [to] => 3.0000 
        [price] => 170.0000 
       ) 

      [1] => Array 
       (
        [from] => 3.0000 
        [to] => 5.0000 
        [price] => 160.0000 
       ) 

      [2] => Array 
       (
        [from] => 5.0000 
        [to] => 9.0000 
        [price] => 150.0000 
       ) 

     ) 

) 

Я хотел бы получить в результате только значения ИСТИНА или ЛОЖЬ.

+0

Возможно, попробуйте сформулировать свой вопрос по-другому. Я не совсем понимаю, что вы ищете ... –

+0

Привет @DaveRandom Я обновил вопрос. Спасибо – Michelangelo

ответ

2

попробовать это (не тестировал, и это, безусловно, не самый лучший способ сделать это):

$match = true; 

foreach ($main_array as $arrays) 
{ 
    foreach($arrays as $key => $array) 
    { 
     $from = $array['from']; 
     $to = $array['to']; 
     foreach($main_array as $tmp_array) 
     {   
      if($tmp_array[$key]['from'] != $from || $tmp_array[$key]['to'] != $to) {    
       $match = false; 
       break 3; 
      } 
     } 
    } 
} 

return $match; 
+0

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

+0

Привет @ redmoon7777 Я пробовал свой код и мне кажется, что он не работает, mybe я что-то не так. Можете ли вы сказать мне, где? http://codepad.org/bYA9b3gG спасибо – Michelangelo

+0

ваша ошибка находится в строке 18, она должна быть foreach ($ range as $ tmp_array) not foreach ($ массивы как $ tmp_array) – redmoon7777

1

Вот мой пример, я испытал. Здесь вы можете сравнить массив массивов, настраиваемых полей и настраиваемым $ глубины

Основная функция:

function array_compare(array $haystack, array $to = array(), array &$matches = array(), $depth = 1) 
{ 
    $total = 0; 
    if ($depth === 1) // We're in right depth, let's check the elements 
    { 
     foreach ($haystack as $key => $value) 
     { 
      $match = true; 
      foreach ($to as $to_key => $to_value) // Check every key 
      { 
       if (!isset($value[$to_key]) || $value[$to_key] !== $to_value) 
       { 
        $match = false; // If at least one doesn't match - break and block adding to $matches 
        break; 
       }    
      } 
      if ($match) 
      { 
       $matches[] = $value; // OK, match, let's add to matches. 
      } 
      $total++; // Increase total searched elements 
     } 
    } 
    else // We're not on the right depth level 
    { 
     foreach ($haystack as $key => $value) 
     { 
      $total += array_compare($value, $to, $matches, $depth - 1); // let's gather into 
     } 
    } 

    return $total; // return total searched 
} 

А вот как вы можете использовать его:

$test = array(
    0 => array(
     0 => array(
      'from'  => 1, 
      'to'  => 3, 
      'value'  => 25, 
     ), 
     1 => array(
      'from'  => 1, 
      'to'  => 3, 
      'value'  => 25, 
     ) 
    ), 
    1 => array(
     0 => array(
      'from'  => 2, 
      'to'  => 5, 
      'value'  => 25, 
     ), 
     1 => array(
      'from'  => 1, 
      'to'  => 3, 
      'value'  => 25, 
     ) 
    ), 
    2 => array(
     1 => array(
      'from'  => 1, 
      'to'  => 15, 
      'value'  => 25, 
     ) 
    ), 
); 

$matches = array(); 
$total = array_compare($test, array('from' => 1, 'to' => 3), $matches, 2); 
var_dump($matches, $total); 

Ваше истинное должно быть в случае, если count ($ matches) === $ total;

Надеюсь, что это то, что вам нужно;

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