【问题标题】:search php array for specific values using foreach使用 foreach 在 php 数组中搜索特定值
【发布时间】:2012-11-05 18:21:14
【问题描述】:

我似乎无法从以下 foreach 代码中获得任何结果。我似乎无法递归地遍历数组,也无法制作该数组的较小数组。我只想从数组中挑选数据并将数据放在更小的数组中。

PHP 代码

$ii = 0;
foreach ($array as $key => $value)
      { 
       $vv = $value;
       if($vv== 'Alpha')
             {
         $ii++;
          $list[$ii]['info'] = $vv;   // my new array
         }  
      }  

PHP print_r($array)

Array
(
[0] => Array
    (
        [moredetails] => Array
            (
                [moredetails] => Array
                    (
                        [0] => Array
                            (
                                [productId] => 9999
                                [productName] => Name
                                [productType] => Alpha 
                                [serialNumber] => 
                                [serviceItemId] => 123456                                   
                            )

                      [1] => Array
                            (


                                [productId] => 8888
                                [productName] => Name
                                [productType] => Beta
                                [serialNumber] => 
                                [serviceItemId] => 123456                                   
                            )
                    )
             )
      )
)    

理想结果

Array
(
  [0]
    (
     [productID] => 9999
     [productName] => Name
     {productType] => Alpha
     )
 )

找到解决方案!

function miniArray($array, &$simple, $ii)
{
   foreach($array as $key => $value)
   {

       if(is_array($value)){            
        $ii++;
            miniArray($value, $simple, $ii);
       }
       else
       {
        $simple[$ii][$key] = $value;

    }   

   }
}

miniArray($service, $simple_array, 0);

【问题讨论】:

  • foreach 不会递归循环遍历数组。您必须为此编写一个自定义函数。
  • 我没有得到任何结果是有道理的。没有内置的 PHP 函数循环遍历多维数组?
  • 不,不是真的,但是如果您查看 array_key_exists、array_search 等页面上的 PHP 手册,则可以选择大量递归数组搜索函数。
  • 当然是。一种叫做array_walk_recursive。我建议您在 PHP 手册中查看更多选项:php.net/arrays 以及数组本身的基础知识:php.net/array
  • 快速提示:如果您计划推出自己的循环机制,请记住数组可能会引用自身(或在子数组中),从而有效地导致无限递归。

标签: php multidimensional-array foreach


【解决方案1】:
<?php
    function miniArray($array, &$simple)
    {
        foreach($array as $key => $value)
        {
            if(is_array($value))
                miniArray($value, $simple);
            else
                $simple[] = $value;
        }
    }

    miniArray($complex_array, $simple_array);
?>

【讨论】:

  • 我编辑了我的问题,但你的答案是我用来创建函数的!非常感谢!
  • 您不必将 $ii 作为参数传递。 $simple[] = $value; sintax 会将$value 添加到$simple 中的下一个可用索引中。例如:第一次执行时,它会被解释为$simple[0] = $value;。第二次是$simple[1] = $value;,以此类推。
  • 除非您将数组存储在索引中,即找到它们的深度。如果是这样,请忽略它。
  • 我正在存储一个数组索引。所以这就是为什么。 :)
【解决方案2】:

foreach 只会通过数组的外层。在第一个循环中,$key 将是 0$value 将是一个数组 - 永远不会匹配 'Alpha'

您需要的是一个递归函数。 PHP 为我们提供了一个很好的快捷方式,array_walk_recursive,它允许您提供自己的函数,该函数将递归地应用于每个元素。

$list = array(); //your new array

function walker($value, $key) {
    if ($value == 'Alpha') $list[] = $value;
}

array_walk_recursive($array, 'walker'); //$array is your original array

【讨论】:

  • 这看起来不错。如果 $value == 'Alpha',我将如何将 productid、productname 添加到 $list[]?
  • 嗯,如果这就是你所需要的,那么仔细看看,array_walk_recursive 毕竟不是你所需要的。对不起这是我的错。根据手册,“任何包含数组的键都不会传递给函数”,因此您似乎无法将正确的值链接在一起。最好使用自定义递归,更符合@freon 的路线。
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2019-09-13
  • 2019-12-29
  • 2022-01-10
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多