0

出于某种原因,我有一个排序的 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 属性是在第一个还是第二个或哪个位置。例如,假设我想将“answer”属性更改为 2。

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

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

3 回答 3

1

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

这实际上很重要,因为在其他语言中,数组索引必须始终是整数。然而,PHP 数组的工作方式与其他语言的字典很相似,其中您的键可以是其他数据类型,如字符串。

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

如果你做不到,不要惊慌。最后,您将不得不进行某种搜索,这是真的。但是,嘿,那么您有两种情况:

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

作为旁注,您无法映射事物以避免浪费一些 CPU 时间或一些 RAM 空间,通常您可以将一个交换为另一个。我的意思是,如果你只存储一个由 question_id 索引的数组,那么你可以在 O(1) + O(array-access) 时间内查找 question_id。如果 O(array-access) 是一个常数,那么你可以在 O(1) 中得到东西。这意味着恒定的时间,并且它尽可能快。

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

但是,如果您存储了尽可能多的数组来订购它们,那么您只需要 O(1) 时间来访问它们中的每一个。但是,您需要 O(n) 空间(这里的 n 是可以直接访问的功能数量)。

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

于 2012-09-15T12:58:12.173 回答
0

不,如果不遍历数组,就无法访​​问该元素。但是,您可以将该搜索抽象为一个辅助函数。

于 2012-09-15T12:36:47.060 回答
0

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

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

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

如果您想要或必须保留该结构,那么只需编写一个函数来获取您想要array的参数来搜索数组associative indexvalue返回找到的索引,这样您就不会被迫一遍又一遍地编写这个循环...

于 2012-09-15T12:38:34.263 回答