2012-09-15 65 views
0

出于某种原因,我有一个排序PHP数组:排序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; 
    } 
} 

回答

0

随着你的情况是不可能没有一个循环,但如果你改变你的阵列结构,以这样的:

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

其中39和40是你的question_id,那么你就可以这么快访问它们没有任何循环。

如果你想或必须保持这种结构,然后只写一个函数来获取array,该associative indexvalue要作为参数来搜索阵列,并返回找到的指数,这样你就不会被强制一遍又一遍地写这个循环...

0

没有,就没有办法访问元件,而不循环您的阵列。但是,您可以将该搜索抽象为辅助函数。

1

一个PHP数组允许你通过它的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是可以直接访问的特征的数量)。

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

+0

这样的帮助和完整的答案。非常感谢。 – ElPiter