【问题标题】:Move array with same value inside the same array在同一数组内移动具有相同值的数组
【发布时间】:2013-05-08 22:49:39
【问题描述】:

这是我的数组。

Array
(
    [id] => 1
    [color] => "White"
    [something] => Array
    (
        [country] => "France"
        [city] => "Paris"
    )

)
Array
(
    [id] => 2
    [color] => "Black"
    [something] => Array
    (
        [country] => "Germany"
        [city] => "Berlin"
    )

)
Array
(
    [id] => 2
    [color] => "Red"
    [something] => Array
    (
        [country] => "Russia"
        [city] => "Moscow"
    )

)

我想对具有相同 id 值的数组进行分组。这应该是输出:

[0] => Array
(
    [0] => Array
    (
        [id] => 1
        [color] => "White"
        [something] => Array
        (
                [country] => "France"
                [city] => "Paris"
        )

    )

)
[1] => Array
(

    [0] => Array
    (
        [id] => 2
        [color] => "Black"
        [something] => Array
        (
            [country] => "Germany"
            [city] => "Berlin"
        )

    )
    [1] => Array
    (

        [id] => 2
        [color] => "Red"
        [something] => Array
        (
            [country] => "Russia"
            [city] => "Moscow"
        )

    )

)

我尝试了数十个foreach 语句,但我无法在同一个数组中获取具有相同id 的数组。它可能与它是一个多维数组的事实有关吗?我应该使用 2 个嵌套的foreach 来获得结果吗?

【问题讨论】:

    标签: php arrays merge grouping


    【解决方案1】:

    代码:

    <?php
    
    $arr = array(
        array(
            'id'    => 1,
            'color' => 'white',
            'something' => array(
                'country' => 'France',
                'city'    => 'Paris',
            ),
        ),
        array(
            'id'    => 2,
            'color' => 'Black',
            'something' => array(
                'country' => 'Germany',
                'city'    => 'Berlin',
            ),
        ),
        array(
            'id'    => 2,
            'color' => 'Red',
            'something' => array(
                'country' => 'Russia',
                'city'    => 'Moscow',
            ),
        ),
    );
    
    
    function groupify($arr) {
        $new = array();
        foreach ($arr as $item) {
            if (!isset($new[$item['id']])) {
                $new[$item['id']] = array();
            }
            $new[$item['id']][] = $item;
        }
        return $new;
    }
    
    print_r(groupify($arr));
    

    结果:

    Array
    (
        [1] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [color] => white
                        [something] => Array
                            (
                                [country] => France
                                [city] => Paris
                            )
    
                    )
    
            )
    
        [2] => Array
            (
                [0] => Array
                    (
                        [id] => 2
                        [color] => Black
                        [something] => Array
                            (
                                [country] => Germany
                                [city] => Berlin
                            )
    
                    )
    
                [1] => Array
                    (
                        [id] => 2
                        [color] => Red
                        [something] => Array
                            (
                                [country] => Russia
                                [city] => Moscow
                            )
    
                    )
    
            )
    
    )
    

    如果您不想保留密钥,只需在return 之前调用array_values

    【讨论】:

    • 基本上我尝试了几十个类似的功能,但没有成功。感谢您的“结果”示例,我了解问题出在哪里。我没有在 Array() 中传递结果。我总是传递 3 个单独的数组 Array(1) Array(2) Array(3) 而不是 Array( Array(1) Array(2) Array(3) )。谢谢你。
    【解决方案2】:

    使用 id 作为新数组的键。

    $a[$array[id]][] = $array;

    【讨论】:

      【解决方案3】:

      如果你想使用 foreach:

      <?php
      $return = array();
      foreach($array as $key => $innerArray) {
          $return[$innerArray['id']][]= $innerArray;
      }
      

      现在 $return 包含通过 ID 摸索的它们,其中键 1 和 2 是您的 ID

      array(
          1 => array(
              array(/** **/) 
          ),
          2 => array(
              array(/** **/),
              array(/** **/) 
          );
      );
      

      然后您可以像这样访问您的组:

      foreach($return as $key => $groupArray) {
          // you have the groups here
      
          foreach($groupArray as $id => $singleArray) {
             // singleArray contains your id, colour etc
          }
      }
      
      foreach($return[1] as $groupOne) {
          // all arrays with id = 1
      }
      

      【讨论】:

      • 是的,我使用的是相同的方法,但我得到的只是许多错误的数组(有一些奇怪的逻辑),但最重要的是所有具有相同 ID 的元素始终保留在自己的数组中。基本上[0] =>(混乱),[1] =>(混乱),[2] =(混乱)。我还有 3 把钥匙。
      • 对不起。我得到了它。您的代码正在运行,但这不是我想要的。可悲的是,我在发布“我想要这个输出”部分时犯了一个错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2015-01-04
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多