2015-11-02 57 views
0

我有这样一个自定义的其余动作(在扩展类YII /休息/ ActiveController):如何禁用排序返回数组?

public function actionTest() 
{   
    return ["9" => "Nine", "1" => "one"]; 
} 

当调用API,阵列输出是相反的顺序,即:

{ 
    "1": "One" 
    "9": "Nine", 
} 

我想在原来的(预期)顺序...

似乎数组被排序后的数组返回的行动,但我不知道在哪里。这只有在数组键是一个整数发生,预期这样的数组进行排序:

["id-9" => "Nine", "id-1" => "one"] 

有使用ArrayDataProvider设置“排序” =假试过,但没有什么区别。

+0

看起来你正在返回一个字典,而不是一个数组。如果你是,那么你不能返回一个“有序字典”,字典通常围绕一个没有顺序的散列表进行。在正在使用的语言/运行时中是否存在“已排序字典”类型? –

+0

自PHP 5.4以来,短数组语法[]与'array()'相同,所以它应该没有关系。 – karpy47

+0

我只是评论,因为你有一个键值数据结构,也被序列化为json(我假设)作为一个对象。这可以解释为什么它没有顺序,由于密钥被哈希的方式,字典通常没有顺序。仍然假设这是json,一个json对象*不保留键排序*,这在规范中特别强调,请参阅http://stackoverflow.com/questions/7198412/keeping-dictionary-keys-of-json-object- in-order-in-objective-c - 如果要保留排序,则必须使用除字典或json对象之外的其他内容。 –

回答

2

既然你导出为JSON,看着,从这个问题 - Keeping dictionary keys of JSON Object in order in Objective C,由Henning Makholm留下的回答说:

在JSON对象,顾名思义,该键 - 顺序值对没有意义。该规范允许JSON生产者以任何想要的方式对它们进行置换,即使是随机的 - 也不需要解析器来保存排序。 RFC 4627说:

对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,空值,对象或数组。

因此,json没有排序,因为它使用字典作为其数据结构,并且由于字典散列快捷键的方式,它们通常没有隐式或显式排序。

这可能是您的程序中的实际底层表示是有序的,但JSON输出没有这样的保证。

解决此问题的一种方法是移动到保存顺序的不同数据结构。