0

次の配列を検討してください。yesterdayこれらは、およびの上位 5 名の従業員を表していtodayます。

$yesterday = array(
   6 => array('name' => 'Tod', 'score' => 9.5),
  12 => array('name' => 'Jim', 'score' => 7.3),
  18 => array('name' => 'Bob', 'score' => 8.4),
   7 => array('name' => 'Jan', 'score' => 6.2),
  20 => array('name' => 'Sam', 'score' => 6.0),
);

$today = array(
   6 => array('name' => 'Tod', 'score' => 9.1),
   9 => array('name' => 'Jef', 'score' => 9.3),
  35 => array('name' => 'Axl', 'score' => 7.6),
   7 => array('name' => 'Jan', 'score' => 6.5),
  41 => array('name' => 'Ted', 'score' => 8.0),
);

上記からコンパイルされた 3 つの新しい配列が必要です:昨日トップ5に入っていた従業員を保持し、$stay今日もそうです。 -5 リスト:$gone$new$today

// notice that the scores in $stay come from $today, not $yesterday
// also notice that index keys are maintained

$stay = array(
  6 => array('name' => 'Tod', 'score' => 9.1),
  7 => array('name' => 'Jan', 'score' => 6.5)

);

$gone = array(
  12 => array('name' => 'Jim', 'score' => 7.3),
  18 => array('name' => 'Bob', 'score' => 8.4),
  20 => array('name' => 'Sam', 'score' => 6.0)
);

$new = array(
   9 => array('name' => 'Jef', 'score' => 9.3),
  35 => array('name' => 'Axl', 'score' => 7.6),
  41 => array('name' => 'Ted', 'score' => 8.0)
);

ここでロジックを構築する方法についての手がかりはありません。ループから始めましたが、遠くまで行きませんでした。私はそれがこのようなものであるべきだと信じています。これを正しく理解するのを手伝ってもらえますか?

for ($i = 0; $i < count($yesterday); $i++) {
  // I'm comparing key numbers, but not key values
  // how do I compare key values?
  if (in_array($yesterday[$i], $today) {
    // add to $stay array
  }
  else {
    // add to $gone array
  }
}

for ($i = 0; $i < count($today); $i++) {
  if (!in_array($today[$i], $yesterday) {
    // add to $new array
  }
}

PSこれが役立つかどうかはわかりませんが、$yesterday常に$today同じ長さです(この場合は5アイテムですが、たとえば両方の配列が7または10アイテムを保持する他のシナリオが可能です)。と の結合されたアイテムは$stay、論理的に常にまたは:-)$newのアイテムの数に等しくなります。$yesterday$today

4

3 に答える 3

2

https://www.php.net/manual/function.array-intersect.php
https://www.php.net/manual/function.array-diff.php

$c = array_intersect($a, $b);
$d = array_diff($a, $b);
$e = array_diff($b, $a);
于 2012-08-30T20:58:36.617 に答える
1

これはうまくいくはずですが、これを行うための最速の方法ではないと思います。

$stay = array();
$gone = array();
$new = array();
$found = false;
foreach($yesterday as $yKey)
{         
  $found = false;
  foreach($today as $tKey)
  {
    if($tKey['name'] == $yKey['name'])
    {
      $found = true;
      $stay[]['name'] = $tKey['name'];  
      break;
    }  
    else
    {
      $found = false;
    }
  }
  if($found == false)
    {
      $gone[]['name'] = $yKey['name'];
    }  
}

foreach($today as $tKey)
{
  $found = false;
  foreach($yesterday as $yKey){
    if($yKey['name'] == $tKey['name'])
    {
      $found = true;
      break;
    }  
    else{
      $found = false;
    }
  }
  if($found == false)
    {
      $gone[]['name'] = $tKey['name'];
    }
}
于 2012-08-30T21:18:58.050 に答える
1

これは、PHP の多くの強力な配列関数のほんの一部を使用して実現できます。

$stay = array_intersect_assoc($yesterday, $today);
$gone = array_diff_assoc($yesterday, $today);
$new = array_diff_assoc($today, $yesterday);
于 2012-08-30T21:28:56.620 に答える