【问题标题】:how to build arrays of objects in PHP without specifying an index number?如何在不指定索引号的情况下在 PHP 中构建对象数组?
【发布时间】:2011-04-12 02:03:10
【问题描述】:

这是一个奇怪的问题。我正在手动构建一个对象数组,如下所示:

$pages_array[0]->slug = "index";
$pages_array[0]->title = "Site Index";  
$pages_array[0]->template = "interior";

$pages_array[1]->slug = "a";
$pages_array[1]->title = "100% Wide (Layout A)";
$pages_array[1]->template = "interior";

$pages_array[2]->slug = "homepage";
$pages_array[2]->title = "Homepage";
$pages_array[2]->template = "homepage";

我喜欢这样清晰,但是因为我必须指定索引号,所以我不能轻松地重新排列它们。没有索引号怎么办?相关,有什么更好的方法来做到这一点?

我还尝试通过创建一个类来编写这个,并让数组上的每个点都是该类的实例。但是由于这是一个配置文件,很难阅读和知道哪个参数与哪个参数一起使用。这就是我选择上面这种老式方法的原因。

非常感谢任何想法!

【问题讨论】:

  • (sidenote) PHP 有一个用于存储对象集合的本地类SplObjectStorage。如果您需要特定顺序的对象,请查看SplMaxHeap
  • 请澄清问题。你想通过“重新排列”来达到什么目的?

标签: php arrays object


【解决方案1】:

这段代码

 $pages_array[1]->slug = "a";

无论如何都是无效的 - 如果您没有正确初始化对象,您将收到“严格”警告。所以你必须以某种方式构造一个对象——要么使用构造函数:

 $pages_array[] = new MyObject('index', 'title'....)

或使用 stdclass 强制转换

 $pages_array[] = (object) array('slug' => 'xxx', 'title' => 'etc')

【讨论】:

  • 嘿,我就是这样做的,收到警告“PHP 警告:从空值创建默认对象”我该如何解决这个问题?
  • (object) array(...) 这就是我想要让我的代码像专业人士一样
【解决方案2】:

如果您使用命名键而不是对象将它们设为数组,您可以这样做:

$pages_array = array(
     array(
         'slug' => 'index',
         'title' => 'Site Index',
         'template' => 'interior'
     ),

     array(
         'slug' => 'a',
         'title' => '100% Wide (Layout A)',
         'template' => 'interior'
     ),

     array(
         'slug' => 'homepage',
         'title' => 'Homepage',
         'template' => 'homepage'
     )
);

您可以将其与 Fanis 的解决方案结合使用,如果您愿意,可以使用 slug 作为键。

【讨论】:

    【解决方案3】:

    有三种方式:

    方式一:

    $pages_array=[
        [
            "id" => 1,
            "name" => "James"
        ],
        [
            "id" => 2,
            "name" => "Mary"
        ]
    
    ];
    

    方式 2:

     $pages_array[0] =
        [
            "id" => 1,
            "name" => "James"
        ];
     $pages_array[1] = 
        [
            "id" => 2,
            "name" => "Mary"
        ];
    

    方式 3:

    $pages_array = array(
        array(
          "id" => 2,
          "name" => "Mary"
        ),
    
        array(
          "id" => 1,
          "name" => "James"
        ),
       
    );
    

    【讨论】:

      【解决方案4】:

      假设您没有在其他地方设置任何 $pages_array 元素,您可以设置一个简单的变量。

      $i = 0;
      
      $pages_array[$i]->slug = "index";
      $pages_array[$i]->title = "Site Index";  
      $pages_array[$i]->template = "interior";
      $i++;
      
      $pages_array[$i]->slug = "a";
      $pages_array[$i]->title = "100% Wide (Layout A)";
      $pages_array[$i]->template = "interior";
      $i++;
      
      $pages_array[$i]->slug = "homepage";
      $pages_array[$i]->title = "Homepage";
      $pages_array[$i]->template = "homepage";
      $i++;
      

      您只需要记住每次都增加$i,以免覆盖元素。

      【讨论】:

      • 这些都是很棒的想法,谢谢大家!对象转换和为索引使用变量都是解决我问题的好方法,非常简单,非常感谢。
      【解决方案5】:

      假设 slug 是唯一的,也许用它来识别你的页面数组:

      $pages_array = array() ;
      
      $pages_array['index'] = array() ;
      $pages_array['index']['title'] = 'Site Index' ;
      $pages_array['index']['template'] = 'interior' ;
      
      $pages_array['a'] = array() ;
      $pages_array['a']['title'] = '100% Wide (Layout A)' ;
      $pages_array['a']['template'] = 'interior' ;
      

      您只需要使用数组键来获取您的 slug 值。

      【讨论】:

        【解决方案6】:

        如果你想维护序列索引。可能这会有所帮助。

        $pages_array[]->slug = "index";
        $key = array_search(end($pages_array),$pages_array );
        $pages_array[$key]->title = "Site Index";  
        $pages_array[$key]->template = "interior";
        
        $pages_array[]->slug = "a";
        $key = array_search(end($pages_array),$pages_array );
        $pages_array[$key]->title = "100% Wide (Layout A)";
        $pages_array[$key]->template = "interior";
        
        $pages_array[]->slug = "homepage";
        $key = array_search(end($pages_array),$pages_array );
        $pages_array[$key]->title = "Homepage";
        $pages_array[$key]->template = "homepage";
        

        Check

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-28
          • 2018-05-05
          • 2016-09-21
          • 1970-01-01
          • 2012-12-14
          • 2016-08-16
          • 2016-07-21
          • 2013-07-27
          相关资源
          最近更新 更多