【问题标题】:foreach loop only repeating last array value [duplicate]foreach 循环仅重复最后一个数组值
【发布时间】:2011-11-28 15:39:38
【问题描述】:

我有两个数组。

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);

【问题讨论】:

  • if 需要与== 进行比较,而不仅仅是=
  • 你可能想要$valueA == $keyB而不是$valueA = $keyB

标签: php arrays foreach


【解决方案1】:

首先: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' );

【讨论】:

  • 我在想你为什么只发送评论而不是回答:)
  • 这是一个简单的答案,适合评论。我认为这是一个更强大的答案(举例说明),我现在做了,但其他用户将来可以为我做,因为我的评论。 :)
  • @David,在这两个方面都是正确的,你的第二个答案对于像我这样的新手来说太优雅了,我必须写 10 行评论才能在未来理解它! !!
  • 我已为您发表评论,以便您更好地了解它的工作原理。 ;)
【解决方案2】:
$common_keys = array_intersect($ArrayA, array_keys($ArrayB));
$arrayC = array();
foreach($common_keys as $key) {
   $arrayC[$key] = $ArrayB[$key];
}

【讨论】:

  • 我赞同这个仅代码回答错字问题。
【解决方案3】:

你只需要一个循环:

      foreach ($ArrayA as $valueA) {
         $ArrayC [$valueA] = $arrayB[$valueA];
      }

【讨论】:

    【解决方案4】:
    $arrayC=Array()
    foreach($arrayA as $valueA){
       $arrayC[$valueA]=$arrayB[$valueA];
    }
    

    【讨论】:

      【解决方案5】:

      您正在混合小写/大写变量名称。您需要使用$valueB 而不是$ValueB

      另外,在您的 if 中,您正在分配,而不是比较。

      【讨论】:

        【解决方案6】:

        如果您想在不循环数组的情况下执行此操作,可以尝试使用 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 );
        

        【讨论】:

          【解决方案7】:

          这是一个更好的方法:

          <?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
          )
          

          【讨论】:

          • ...除了它不符合 OP 的要求。试试他提供的示例数组。
          • 手册说用于array_combine;返回组合数组,如果每个数组的元素数不相等,则返回 FALSE。
          • 对于数组组合,您需要两个数组中的变量数量相等。
          猜你喜欢
          • 2017-08-19
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 2013-08-03
          • 2020-05-28
          • 2019-10-22
          • 1970-01-01
          • 2021-01-01
          相关资源
          最近更新 更多