【问题标题】:CakePHP function to convert dotted arrays to multidimensionalCakePHP函数将点数组转换为多维
【发布时间】:2009-11-17 01:32:37
【问题描述】:

在 CakePHP 中,似乎很多函数都可以将其参数作为嵌套、多维数组或点字符串:

$this->MyModel->contain(array(
    'Something', 'Something.Else', 'Something.Else.Entirely'
));
$this->MyModel->contain(array(
    'Something' => array(
        'Else' => 'Entirely'
    )
));

因此,我认为核心中的某处必须有一个函数可以从点状关联切换到嵌套关联,但我一生都找不到它。有什么想法吗?

【问题讨论】:

    标签: arrays cakephp multidimensional-array


    【解决方案1】:

    我实际上已经想出了自己的方法来利用内置的 Set 函数来完成这项工作。

    给定:

    $input = array (
        'Post.id' => 1,
        'Post.title' => 'Some post title.',
        'Post.Tag.0.id' => 4,
        'Post.Tag.0.name' => 'cakephp',
        'Post.Tag.1.id' => 7,
        'Post.Tag.1.name' => 'mysql',
    );
    

    此代码会将其放入嵌套关联数组中。

    $output = array();
    foreach ($input as $key => $value) {
        $output = Set::insert($output, $key, $value);
    }
    

    这是Set::insert() 的文档

    【讨论】:

      【解决方案2】:

      您正在寻找的是 Set::flatten()。 CakePHP 手册中没有记录,但请查看API definition。

      它的工作原理是这样的(结果可能不准确,这是我的想法):

      $array = array(
          'Post' => array(
              'id' => 1,
              'title' => 'Some post title.',
              'Tag' => array(
                  0 => array(
                      'id' => 4,
                      'name' => 'cakephp',
                  ),
                  1 => array(
                      'id' => 7,
                      'name' => 'mysql',
                  ),
              ),
          );
      );
      
      $array = Set::flatten($array);
      var_dump($array);
      

      您的 $array 变量现在将如下所示:

      Array (
          'Post.id' => 1,
          'Post.title' => 'Some post title.',
          'Post.Tag.0.id' => 4,
          'Post.Tag.0.name' => 'cakephp',
          'Post.Tag.1.id' => 7,
          'Post.Tag.1.name' => 'mysql',
      )
      

      【讨论】:

      • 谢谢马特,不幸的是,我实际上需要与此完全相反的内容。
      • 我很高兴你误读了这个问题 ;-) 这是我一直在寻找的一个不错的功能!
      【解决方案3】:

      这只是整个 Cake 的惯例,但每个部分都有自己的自定义解析。如果您查看cake/libs/model/behaviors/containable.php 中的函数ContainableBehavior::containments(),您会看到很多preg_matching 和explode('.')ing 正在运行。至少在 Containable 的情况下,冗长的array('name' => array(...)) 语法似乎是规范的语法,但它可以缩写为点语法,它只会被扩展。我猜想扩展本身在不同部分之间的差异太大,无法在一个中心函数中轻松总结。

      那个,或者他们还没有做到。 :)

      【讨论】:

      • deceze,我发现自己正在阅读 SO 上的 CakePHP 帖子,以便发现新的东西。每次发布时都会发生。感谢您的补充信息,继续努力!
      • 我实际上也从这些问题中学到了很多东西,这是一种互惠互利的关系。 :-3
      【解决方案4】:

      很好的问题,我只是在寻找同样的东西。显然它会出现在 Cake 2.2 中。

      新的 Hash 类(Set 类的新改进版本)具有执行此操作的 expand() 函数。需要用到的可以在Github上查看代码:

      https://github.com/cakephp/cakephp/blob/2.2/lib/Cake/Utility/Hash.php

      ...但是 nickf 发布的解决方案也很有效。 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多