简体   繁体   中英

Comparing multiple arrays for the same values

I have the following code that produces an array.

I need to split that array up and compare the resulting arrays against one another.

I only need to compare arrays that are next to one another in order.

So the first and second, second and third, so on.. I can build another array to store the order that needs to be compared if that helps. I just haven't a clue how to check them like this.

The goal is to ensure that the arrays on either side of one another do not contain the same $racer_id

It's for a scoring app for a race track and one racer can not be in races that are one after the other.

Can someone give me a shove in the right direction?

** there will only be one $event_id, with multiple $class_id and $racer_id.

<?php
function getEventClasses()
{
    global $db;
    global $event_id;
    try {
        $getEventClasses = $db->prepare('SELECT class_id
                                     FROM tbl_event_classes
                                     WHERE event_id = :event_id
                                     ORDER BY sort');
        $getEventClasses->bindValue(':event_id', $event_id);
        $getEventClasses->execute();
    } catch (PDOException $ex) {
        echo 'An Error occurred!<br>';
        //user friendly message
        $ex->getMessage();
        echo $ex;
        exit;
    }
    $eventClasses = [];
    while ($r = $getEventClasses->fetch(PDO::FETCH_ASSOC)) {
        $eventClasses[] = [
            'class_id' => $r['class_id']
        ];
    }
    return $eventClasses;
}

function getEntries($class_id)
{
    global $db;
    global $event_id;
    try {
        $getEntries = $db->prepare('SELECT tbl_event_entries.racer_id, 
                                   tbl_event_entries.class_id, 
                                   tbl_event_entries.event_id, 
                                   tbl_event_classes.class_type, 
                                   tbl_event_classes.points_class, 
                                   tbl_moto_order.moto_nbr
                            FROM tbl_moto_order 
                            INNER JOIN (tbl_event_entries 
                             LEFT JOIN tbl_event_classes 
                                    ON (tbl_event_entries.event_id = tbl_event_classes.event_id)
                                    AND (tbl_event_entries.class_id = tbl_event_classes.class_id)) 
                                    ON (tbl_moto_order.class_id = tbl_event_entries.class_id)
                                    AND (tbl_moto_order.event_id = tbl_event_entries.event_id)
                            WHERE tbl_event_entries.event_id = :event_id
                            AND tbl_event_entries.racer_id != "9999"
                            AND tbl_event_entries.class_id = :class_id');
        $getEntries->bindValue(':event_id', $event_id);
        $getEntries->bindValue(':class_id', $class_id);
        $getEntries->execute();
    } catch (PDOException $ex) {
        echo 'An Error occurred!<br>';
        //user friendly message
        $ex->getMessage();
        echo $ex;
        exit;
    }
    $eventEntries = [];
    while ($r = $getEntries->fetch(PDO::FETCH_ASSOC)) {
        $eventEntries[] = [
            'racer_id'     => $r['racer_id'],
            'class_id'     => $r['class_id'],
            'event_id'     => $r['event_id'],
            'class_type'   => $r['class_type'],
            'points_class' => $r['points_class'],
            'moto_nbr'     => $r['moto_nbr']
        ];
    }
    return $eventEntries;
}

$eventClasses = getEventClasses();
foreach ($eventClasses as $eventClass) {
    $eventEntries = getEntries($eventClass['class_id']);
    foreach ($eventEntries as $eventEntry) {
        $runningClasses[$eventClass['class_id']][] = [
            'racer_id'     => $eventEntry['racer_id'],
            'event_id'     => $eventEntry['event_id'],
            'class_type'   => $eventEntry['class_type'],
            'points_class' => $eventEntry['points_class'],
            'moto_nbr'     => $eventEntry['moto_nbr']
        ];
    }
}
foreach ($runningClasses as $class) {
    $f->printr($class);
}
?>

the array:

     Array
 (
     [17] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 95
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 17
                     [moto_nbr] => 3
                 )
             [1] => Array
                 (
                     [racer_id] => 350
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 17
                     [moto_nbr] => 3
                 )
             [2] => Array
                 (
                     [racer_id] => 493
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 17
                     [moto_nbr] => 3
                 )
             [3] => Array
                 (
                     [racer_id] => 295
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 17
                     [moto_nbr] => 3
                 )
             [4] => Array
                 (
                     [racer_id] => 1142
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 17
                     [moto_nbr] => 3
                 )
             [5] => Array
                 (
                     [racer_id] => 628
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 17
                     [moto_nbr] => 3
                 )
         )
     [14] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 1142
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [1] => Array
                 (
                     [racer_id] => 162
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [2] => Array
                 (
                     [racer_id] => 151
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [3] => Array
                 (
                     [racer_id] => 1176
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [4] => Array
                 (
                     [racer_id] => 401
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [5] => Array
                 (
                     [racer_id] => 264
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [6] => Array
                 (
                     [racer_id] => 797
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [7] => Array
                 (
                     [racer_id] => 124
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [8] => Array
                 (
                     [racer_id] => 29
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [9] => Array
                 (
                     [racer_id] => 74
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [10] => Array
                 (
                     [racer_id] => 117
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [11] => Array
                 (
                     [racer_id] => 408
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [12] => Array
                 (
                     [racer_id] => 501
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
             [13] => Array
                 (
                     [racer_id] => 1125
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 14
                     [moto_nbr] => 4
                 )
         )
     [8] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 1180
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 8
                     [moto_nbr] => 6
                 )
         )
     [16] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 73
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 16
                     [moto_nbr] => 12
                 )
             [1] => Array
                 (
                     [racer_id] => 9
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 16
                     [moto_nbr] => 12
                 )
             [2] => Array
                 (
                     [racer_id] => 525
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 16
                     [moto_nbr] => 12
                 )
         )
     [13] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 1089
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [1] => Array
                 (
                     [racer_id] => 73
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [2] => Array
                 (
                     [racer_id] => 162
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [3] => Array
                 (
                     [racer_id] => 264
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [4] => Array
                 (
                     [racer_id] => 797
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [5] => Array
                 (
                     [racer_id] => 422
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [6] => Array
                 (
                     [racer_id] => 1176
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [7] => Array
                 (
                     [racer_id] => 76
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
             [8] => Array
                 (
                     [racer_id] => 1136
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 13
                     [moto_nbr] => 15
                 )
         )
     [5] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 600
                     [event_id] => 326
                     [class_type] => Y
                     [points_class] => 5
                     [moto_nbr] => 16
                 )
             [1] => Array
                 (
                     [racer_id] => 1143
                     [event_id] => 326
                     [class_type] => Y
                     [points_class] => 5
                     [moto_nbr] => 16
                 )
         )
     [10] => Array
         (
             [0] => Array
                 (
                     [racer_id] => 421
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 10
                     [moto_nbr] => 19
                 )
             [1] => Array
                 (
                     [racer_id] => 1219
                     [event_id] => 326
                     [class_type] => A
                     [points_class] => 10
                     [moto_nbr] => 19
                 )
         )
 )

First Answer

You can achieve this by comparing the current racer id with the next racer id in array ...

<?php 
$InputArray = array(
            17=>array(
                        0=>array(0=>95,1=>2 ),
                        1=>array(0=>350,1=>3),
                        2=>array(0=>493,1=>4),
                        3=>array(0=>493,1=>4)
                    ),
            18=>array(
                        0=>array(0=>56,1=>2 ),
                        1=>array(0=>89,1=>3),
                        2=>array(0=>52,1=>4)
                    ),
             );

Loop for comparing racer ID's

foreach($InputArray as $key => $val)
{
    foreach($val as $k => $v)
    {
        $nextKey =$k+1;
        if(array_key_exists($nextKey,$val))
        {
            if($v[0]==$val[$nextKey][0])
            {
                    echo "Racer ID ".$v[0]." Mathced in Class ID : ".$key;
                    ////sucess code here if same race id's are there...
            }
        }
    }
}
?>

This will O/P

Racer ID 493 Mathced in Class ID : 17

As in the $InputArray racer id(493) at index 2 and 3 is same in class id 17

LIVE DEMO FOR THIS

Modified Answer

$InputArray = array(
                17=>array(
                            0=>array('racer_id'=>95,'event_id'=>326 ),
                            1=>array('racer_id'=>350,'event_id'=>326),
                            2=>array('racer_id'=>493,'event_id'=>326),
                            3=>array('racer_id'=>1142,'event_id'=>326)
                        ),
                14=>array(
                            0=>array('racer_id'=>1142,'event_id'=>326),
                            1=>array('racer_id'=>162,'event_id'=>326),
                            2=>array('racer_id'=>151,'event_id'=>326)
                        ),
                 );

Array Looks like:

Array
(
    [17] => Array
        (
            [0] => Array
                (
                    [racer_id] => 95
                    [event_id] => 326
                )

            [1] => Array
                (
                    [racer_id] => 350
                    [event_id] => 326
                )

            [2] => Array
                (
                    [racer_id] => 493
                    [event_id] => 326
                )

            [3] => Array
                (
                    [racer_id] => 1142
                    [event_id] => 326
                )

        )

    [14] => Array
        (
            [0] => Array
                (
                    [racer_id] => 1142
                    [event_id] => 326
                )

            [1] => Array
                (
                    [racer_id] => 162
                    [event_id] => 326
                )

            [2] => Array
                (
                    [racer_id] => 151
                    [event_id] => 326
                )

        )

)   

Find duplicate Id in two adjacent classes

$keys = array_keys($InputArray);///this will give you an array of all the class id's 17,14,8...      
foreach($InputArray as $key => $val)
{
    $racer_ids = array_map(function ($ar) {return $ar['racer_id'];}, $val);///get all the racers from current class
    $currentKey = array_search($key,$keys); ///get the key for current class in keys array
    if(array_key_exists($currentKey+1 ,$keys)) //check if next key exist in keys array (key for 14)
    { 
        $nextKey = $keys[$currentKey+1]; /// value present at next key in keys array 14 is the next key
        if(array_key_exists($nextKey,$InputArray)) ///check if next key present in $InputArray
        {
            $next_racer_ids = array_map(function ($ar) {return $ar['racer_id'];}, $InputArray[$nextKey]);///get all the racers from next class
            $result = array_intersect($next_racer_ids,$racer_ids);///compare racer ids from both array's  
            if(!empty($result)) ////return empty if racer_id is not same 
            {
                echo "SAME DRIVER";
                //your success code here
            }
        }
    }
}

LIVE EXAMPLE

Not sure in PHP. But something like this

  for i = 0 to $eventClasses.count - 1 
  { 
      $event = $eventClasses[i];

      for j = 0 to $event.count -2 // last race doesnt compare with next
      {
          $currentEvent = $event[j]
          $nextEvent    = $event[j+1];

          if ($currentEvent[0] == $nextEvent[0] ) 
          {
              echo 'Same driver on next race?'
          }
      }
  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM