排序的php数组“内省”

时间:2012-09-15 12:33:36

标签: php arrays symfony

出于某种原因,我有一个排序的php数组:

"$arr_questions" = Array [6]    
    0   Array [6]   
    1   Array [6]   
    2   Array [6]   
    3   Array [6]   
    4   Array [6]   
    5   Array [6]   

每个位置都是另一个阵列。这次它是联想的。见位置[0]:

0 = Array [6]   
    question_id 40  
    question    La tercera pregunta del mundo   
    explanation 
    choices Array [3]   
    correct 0   
    answer  1   

没有循环我的数组,有没有办法直接访问这个位置0,只知道它的一个属性?

示例...想象一下,我必须更改“question_id”属性为40的数组位置的某些属性。这是我所知道的唯一属性。我不知道question_id属性是在第一个还是第二个或哪个位置。并且,例如,想象一下我想将“回答”属性更改为2。

如何在不循环整个数组的情况下直接访问该位置。我的意思是......我不想这样做:

foreach ($arr_questions as $question){
  if ($question["question_id"] == 40){
    $question["answer"] == 2;
  }
}

3 个答案:

答案 0 :(得分:1)

PHP Array允许您通过其ID访问随机值。

实际上这是一个大问题,因为在其他语言中,数组索引必须始终是整数。 但是,PHP数组的工作方式大致类似于其他语言字典,其中键可以是其他数据类型,如字符串。

通过这个,如果你想能够访问某个问题,并且你知道ID,那么你应该通过让你的question_id成为每个数组条目的索引来构造数组。

如果你不能那样做,不要惊慌。 最后你必须进行某种搜索,这是真的。 但是,嘿,那么你有两个案例:

  • a)您的阵列。哇,在这种情况下,您应该运行一个优化的排序算法,例如mergesort或quicksort,这样您就可以快速订购数据,然后按照您想要的字段对它们进行排序。
  • b)你的阵列不是那么大。我认为在这种情况下它没什么大不了的,排序会使应用程序变得比它应该更慢,如果你想更快,你应该缓存排序问题的结果(如果可能的话)或重构数组结构,以便它使用您想要的密钥作为数组索引。

作为旁注,你不能映射东西,避免浪费一些CPU时间或一些RAM空间,通常你可以互换一个。 我的意思是,如果你只存储一个由question_id索引的数组,那么你可以在O(1)+ O(数组访问)时间内查找question_id。如果O(数组访问)是常量,那么你可以在O(1)中找到东西。这意味着时间不变,而且速度可以达到最快。

但是,如果您需要其他类型的搜索,最终可能会出现O(n * log(n))或O(n²)时间复杂度。

但是,如果你已经存储了多个数组作为订购它们的方法,那么你只需要O(1)时间来访问它们。 但是,你需要O(n)空间(这里的n是可直接访问的特征数量)。

这将增加构建数组的时间(通过常量)。

答案 1 :(得分:0)

不,没有循环遍历数组就无法访问该元素。但是,您可以将该搜索抽象为辅助函数。

答案 2 :(得分:0)

根据您的情况,没有循环就不可能,但如果您将阵列结构更改为:

array(
    39 => array(...), 
    40 => array(...)
)

你的question_id中有39和40,那么你可以快速访问它们而不需要任何循环。

如果您想要或必须保留该结构,那么只需编写一个函数来获取arrayassociative indexvalue作为参数来搜索数组和返回找到的索引,所以你不会被迫反复写这个循环......