Странная проблема с foreach, дифференциальные массивы - PullRequest
0 голосов
/ 16 октября 2019

Мы пытаемся сравнить отличия от двух массивов, код работает на примере w3schools

$new=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow", "g"=>"purple");
$old=array("a"=>"red","b"=>"green","c"=>"white","d"=>"black");

$seen = array( );
foreach ($new as $n) {
[Line 469]        $seen[strtolower($n)]++;
}

foreach ($old as $key => $o) {
    $o = strtolower($o);
    if (!$seen[$o]) { 
      $diffold[$key] = $o; 
    }
}


  $seen2 = array( );
  foreach ($old as $o) {
    $seen2[strtolower($o)]++;
}

foreach ($new as $key => $n) {
    $n = strtolower($n);
    if (!$seen2[$n]) { $diffnew[$key] = $n; }
}


  print_r($diffold);
  print_r($diffnew);

  foreach($diffold as $key => $value) {
    echo "<br>old value is: ".$key." => " . $diffold[$key] ."";
  }

  foreach($diffnew as $key => $value) {
    echo "<br>new value is: ".$key." => " . $diffnew[$key] ."";
  }

Результат как исключение

Array ( [c] => white [d] => black ) Array ( [c] => blue [d] => yellow [g] => purple )
old value is: c => white
old value is: d => black
new value is: c => blue
new value is: d => yellow
new value is: g => purple

Однако мы пытаемся то же самое с Laravel иPHP 7+ и мы получаем эту ошибку

ErrorException: Undefined index: red in file ...Controller.php on line 469

Любой совет, пожалуйста, почему это происходит?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Две проблемы:

При оценке несуществующих ключей в массиве появится предупреждение.

Код, подобный

if (!$seen[$o]) {

Должно быть

if (!isset($seen[$o])) {

Увеличивая несуществующий ассоциированный ключ, вы получите предупреждение

Код типа

seen[strtolower($n)]++;

Должен быть

seen[strtolower($n)] = isset(seen[strtolower($n)]) ? seen[strtolower($n)]+1 : 1;
1 голос
/ 16 октября 2019

Замените Ваш Полный Код этим. Это будет работать. ДЕМО

$new=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow", "g"=>"purple");
$old=array("a"=>"red","b"=>"green","c"=>"white","d"=>"black");

$seen = array( );
$i=1;
foreach ($new as $n) {
    $seen[strtolower($n)] = $i;
    $i++;
}

foreach ($old as $key => $o) {
    $o = strtolower($o);

    if (!isset($seen[$o])) { 
      $diffold[$key] = $o; 
    }
}

$i=1;
  $seen2 = array( );
  foreach ($old as $o) {
    $seen2[strtolower($o)] = $i;
    $i++;
}

foreach ($new as $key => $n) {
    $n = strtolower($n);
    if (!isset($seen2[$n])) { 
        $diffnew[$key] = $n; 
    }
}

print_r($diffold);
print_r($diffnew);

  foreach($diffold as $key => $value) {
    echo "<br>old value is: ".$key." => " . $diffold[$key] ."";
  }

  foreach($diffnew as $key => $value) {
    echo "<br>new value is: ".$key." => " . $diffnew[$key] ."";
  }

ВЫХОД Без ОШИБКИ

Array
(
    [c] => white
    [d] => black
)
Array
(
    [c] => blue
    [d] => yellow
    [g] => purple
)

old value is: c => white
old value is: d => black
new value is: c => blue
new value is: d => yellow
new value is: g => purplesomething
1 голос
/ 16 октября 2019

Ошибка возникает из-за попытки увеличить целые числа еще неопределенного поля.

На первой итерации массив $seen пуст и поэтому в нем нет ключей. При попытке увеличить значение записи ($seen[ strtolower( $n ) ]++;) вам необходимо проверить, существует ли эта запись в этом массиве:

foreach ($new as $n) {
    $key = strtolower($n);
    if ( ! isset($seen[$key])) {
        $seen[$key] = 1;
    } else {
        $seen[$key]++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...