цикл foreach только повторяет последнее значение массива - PullRequest
1 голос
/ 28 ноября 2011

У меня есть два массива.

ArrayA является числовым

(ArrayA => 3, 7, 8)

ArrayB - ассоциативный массив

(1=>bread, 2=>banana, 3=>fruit, 4=> milk, 5=>pizza, 6=> gum, 7=>corn, 8=>lager)

Я хочу создать третий массив, ArrayC, ассоциативный, который сопоставляет значения ArrayA с ключами ArrayB и дает ключам ArrayA соответствующие значения ArrayB.

Другими словами, из этого примера

ArrayC (3 => fruit, 7=>corn, 8=>lager)

Однако мой код только дает мне

ArrayC (3 => lager, 7=>lager, 8=>lager) //last value of ArrayB

Код:

     $ArrayC = array();
     foreach ($ArrayB as $keyB => $valueB) {
          foreach ($ArrayA as $valueA) {
             if ( $valueA = $keyB) {
                   $ArrayC [$valueA] = $valueB;
             }
          }
      }
      print_r($ArrayC);

Ответы [ 7 ]

5 голосов
/ 28 ноября 2011

Первое: if нужно сравнить с ==, а не с = (это заданное значение).

Второе: это лучшая версия кода:

// The keys that you want copy from ArrayB
$ArrayA = array(3, 7, 8);
// The values that will be copied
$ArrayB = array(1 => 'bread', 2 => 'banana', 3 => 'fruit',
                4 => 'milk', 5 => 'pizza', 6 => 'gum', 7 => 'corn',
                8 => 'lager');
// The filtered array (based on ArrayA and ArrayB)
$ArrayC = array();

// For each ArrayA values (3, 7 and 8), trigger this routine
// setting ArrayKey as each value of ArrayA, one for time
foreach($ArrayA as $ArrayKey) {
    // Basically: $ArrayC [3] = $ArrayB [3]; (...)
    $ArrayC [$ArrayKey] = $ArrayB [$ArrayKey];
} 

// Final result will be:
// $ArrayC = array( 3 => 'fruit', 7 => 'corn', 8 => 'lager' );
1 голос
/ 28 ноября 2011
$arrayC=Array()
foreach($arrayA as $valueA){
   $arrayC[$valueA]=$arrayB[$valueA];
}
1 голос
/ 28 ноября 2011

Вам нужен только один цикл:

      foreach ($ArrayA as $valueA) {
         $ArrayC [$valueA] = $arrayB[$valueA];
      }
1 голос
/ 28 ноября 2011
$common_keys = array_intersect($ArrayA, array_keys($ArrayB));
$arrayC = array();
foreach($common_keys as $key) {
   $arrayC[$key] = $ArrayB[$key];
}
0 голосов
/ 28 ноября 2011

Если вы хотите сделать это без зацикливания массивов, вы можете попробовать использовать комбинацию array_intersect_key () и array_flip ()

$ArrayA = array(3, 7, 8);
$ArrayB = array(1 => 'bread', 2 => 'banana', 3 => 'fruit',
            4 => 'milk', 5 => 'pizza', 6 => 'gum', 7 => 'corn',
            8 => 'lager');
$searchArray = array_flip( $ArrayA );
$results = array_intersect_key( $ArrayB, $searchArray );

var_dump( $results );
0 голосов
/ 28 ноября 2011

Вот лучший способ сделать это:

<?php
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);
?>

Это даст вам:

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)
0 голосов
/ 28 ноября 2011

Вы смешиваете строчные / прописные имена переменных.Вы захотите использовать $valueB вместо $ValueB.

Кроме того, в вашем if вы назначаете, а не сравниваете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...