Skip to content

Commit e5dedb0

Browse files
committed
Merge branch 'feat/sort'
2 parents 6f530a5 + 5ab74ea commit e5dedb0

File tree

3 files changed

+154
-20
lines changed

3 files changed

+154
-20
lines changed

README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ Get filtering result of the load string.
126126
* flags
127127

128128
- `Jq::RAW` is raw output
129+
- `Jq::SORT` is object with the keys in sorted order
129130

130131
**Return Values:**
131132

@@ -165,6 +166,7 @@ Get filtering result of the JSON string.
165166
* flags
166167

167168
- `Jq::RAW` is raw output
169+
- `Jq::SORT` is object with the keys in sorted order
168170

169171
**Return Values:**
170172

@@ -193,6 +195,7 @@ Get filtering result of the JSON file.
193195
* flags
194196

195197
- `Jq::RAW` is raw output
198+
- `Jq::SORT` is object with the keys in sorted order
196199

197200
**Return Values:**
198201

@@ -204,10 +207,10 @@ Returns the result value, or FALSE on error.
204207

205208
```php
206209
$jq = Jq\Input::fromString('{"name": "jq", "version": "0.1.0"}');
207-
print_r($jq->filter('.', JQ::RAW));
210+
print_r($jq->filter('.', Jq::RAW));
208211
echo PHP_EOL;
209-
echo 'NAME: ', $jq->filter('.name', JQ::RAW), PHP_EOL;
210-
echo 'VERSION: ', $jq->filter('.version', JQ::RAW), PHP_EOL;
212+
echo 'NAME: ', $jq->filter('.name', Jq::RAW), PHP_EOL;
213+
echo 'VERSION: ', $jq->filter('.version', Jq::RAW), PHP_EOL;
211214
```
212215

213216
The above example will output:
@@ -224,7 +227,7 @@ VERSION: 0.1.0
224227
$text = '{"name": "jq", "version": "0.1.0"}';
225228
print_r(Jq\Run::fromString($text, '.'));
226229
echo 'NAME: ', Jq\Run::fromString($text, '.name'), PHP_EOL;
227-
echo 'VERSION: ', Jq\Run::fromString($text, '.version', JQ::RAW), PHP_EOL;
230+
echo 'VERSION: ', Jq\Run::fromString($text, '.version', Jq::RAW), PHP_EOL;
228231
```
229232

230233
The above example will output:

jq.c

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ ZEND_INI_END()
3939
#define PHP_JQ_NS "Jq"
4040

4141
enum {
42-
PHP_JQ_OPT_RAW = 1
42+
PHP_JQ_OPT_RAW = 1,
43+
PHP_JQ_OPT_SORT = 2,
4344
};
4445

4546
static zend_class_entry *zend_jq_exception_ce;
@@ -121,7 +122,7 @@ static int php_jq_load_file(jv *var, const char *file)
121122
return SUCCESS;
122123
}
123124

124-
static void php_jv_dump(zval **return_value, jv x)
125+
static void php_jv_dump(zval **return_value, jv x, int flags)
125126
{
126127
switch (jv_get_kind(x)) {
127128
default:
@@ -170,7 +171,7 @@ static void php_jv_dump(zval **return_value, jv x)
170171
jv value = jv_array_get(jv_copy(x), i);
171172
if (jv_is_valid(value)) {
172173
zval zv, *p = &zv;
173-
php_jv_dump(&p, value);
174+
php_jv_dump(&p, value, flags);
174175
zend_hash_next_index_insert_new(Z_ARRVAL_P(*return_value),
175176
&zv);
176177
} else {
@@ -186,24 +187,40 @@ static void php_jv_dump(zval **return_value, jv x)
186187
break;
187188
}
188189

190+
jv keyset = jv_null();
189191
while (1) {
190192
jv key, value;
191193
zval zv, *p = &zv;
192194
zend_string *jv_key;
193195

194-
if (first) {
195-
i = jv_object_iter(x);
196+
if (flags & PHP_JQ_OPT_SORT) {
197+
if (first) {
198+
keyset = jv_keys(jv_copy(x));
199+
i = 0;
200+
} else {
201+
i++;
202+
}
203+
if (i >= jv_array_length(jv_copy(keyset))) {
204+
jv_free(keyset);
205+
break;
206+
}
207+
key = jv_array_get(jv_copy(keyset), i);
208+
value = jv_object_get(jv_copy(x), jv_copy(key));
196209
} else {
197-
i = jv_object_iter_next(x, i);
198-
}
199-
if (!jv_object_iter_valid(x, i)) {
200-
break;
201-
}
210+
if (first) {
211+
i = jv_object_iter(x);
212+
} else {
213+
i = jv_object_iter_next(x, i);
214+
}
215+
if (!jv_object_iter_valid(x, i)) {
216+
break;
217+
}
202218

203-
key = jv_object_iter_key(x, i);
204-
value = jv_object_iter_value(x, i);
219+
key = jv_object_iter_key(x, i);
220+
value = jv_object_iter_value(x, i);
221+
}
205222

206-
php_jv_dump(&p, value);
223+
php_jv_dump(&p, value, flags);
207224

208225
jv_key = zend_string_init(jv_string_value(key),
209226
jv_string_length_bytes(jv_copy(key)),
@@ -230,18 +247,22 @@ static void php_jq_filter(zval **return_value, jq_state *jq, jv json, int flags)
230247
int multiple = 0;
231248
while (1) {
232249
zval zv, *p = &zv;
233-
if (flags == PHP_JQ_OPT_RAW) {
250+
if (flags & PHP_JQ_OPT_RAW) {
234251
if (jv_get_kind(result) == JV_KIND_STRING) {
235252
ZVAL_STRING(&zv, jv_string_value(result));
236253
} else {
237-
jv dump = jv_dump_string(result, 0);
254+
int dump_flags = 0;
255+
if (flags & PHP_JQ_OPT_SORT) {
256+
dump_flags = JV_PRINT_SORTED;
257+
}
258+
jv dump = jv_dump_string(result, dump_flags);
238259
if (jv_is_valid(dump)) {
239260
ZVAL_STRING(&zv, jv_string_value(dump));
240261
}
241262
jv_free(dump);
242263
}
243264
} else {
244-
php_jv_dump(&p, result);
265+
php_jv_dump(&p, result, flags);
245266
}
246267

247268
if (!jv_is_valid(result = jq_next(jq))) {
@@ -684,6 +705,7 @@ ZEND_MINIT_FUNCTION(jq)
684705

685706
/* class constant */
686707
PHP_JQ_CLASS_CONST_LONG(RAW, PHP_JQ_OPT_RAW);
708+
PHP_JQ_CLASS_CONST_LONG(SORT, PHP_JQ_OPT_SORT);
687709

688710
/* ini */
689711
ZEND_INIT_MODULE_GLOBALS(jq, zend_jq_init_globals, NULL);

tests/sort.phpt

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
--TEST--
2+
sort
3+
--SKIPIF--
4+
--FILE--
5+
<?php
6+
use Jq\Input;
7+
use Jq\Run;
8+
9+
$text = '{"c":"3", "a":"1", "b":{"2":{"z":"12", "y":"11", "x":"10"}}}';
10+
11+
$jq = Jq\Input::fromString($text);
12+
13+
echo "== default\n";
14+
print_r($jq->filter('.'));
15+
echo "== sort\n";
16+
print_r($jq->filter('.', Jq::SORT));
17+
18+
echo "== raw\n";
19+
echo $jq->filter('.', Jq::RAW), PHP_EOL;
20+
echo "== raw|sort\n";
21+
echo $jq->filter('.', Jq::RAW|Jq::SORT), PHP_EOL;
22+
23+
echo "== run\n";
24+
print_r(Run::fromString($text, '.'));
25+
echo "== run sort\n";
26+
print_r(Run::fromString($text, '.', Jq::SORT));
27+
28+
echo "== run raw\n";
29+
echo Run::fromString($text, '.', Jq::RAW), PHP_EOL;
30+
echo "== run raw|sort\n";
31+
echo Run::fromString($text, '.', Jq::RAW|Jq::SORT), PHP_EOL;
32+
33+
--EXPECTF--
34+
== default
35+
Array
36+
(
37+
[c] => 3
38+
[a] => 1
39+
[b] => Array
40+
(
41+
[2] => Array
42+
(
43+
[z] => 12
44+
[y] => 11
45+
[x] => 10
46+
)
47+
48+
)
49+
50+
)
51+
== sort
52+
Array
53+
(
54+
[a] => 1
55+
[b] => Array
56+
(
57+
[2] => Array
58+
(
59+
[x] => 10
60+
[y] => 11
61+
[z] => 12
62+
)
63+
64+
)
65+
66+
[c] => 3
67+
)
68+
== raw
69+
{"c":"3","a":"1","b":{"2":{"z":"12","y":"11","x":"10"}}}
70+
== raw|sort
71+
{"a":"1","b":{"2":{"x":"10","y":"11","z":"12"}},"c":"3"}
72+
== run
73+
Array
74+
(
75+
[c] => 3
76+
[a] => 1
77+
[b] => Array
78+
(
79+
[2] => Array
80+
(
81+
[z] => 12
82+
[y] => 11
83+
[x] => 10
84+
)
85+
86+
)
87+
88+
)
89+
== run sort
90+
Array
91+
(
92+
[a] => 1
93+
[b] => Array
94+
(
95+
[2] => Array
96+
(
97+
[x] => 10
98+
[y] => 11
99+
[z] => 12
100+
)
101+
102+
)
103+
104+
[c] => 3
105+
)
106+
== run raw
107+
{"c":"3","a":"1","b":{"2":{"z":"12","y":"11","x":"10"}}}
108+
== run raw|sort
109+
{"a":"1","b":{"2":{"x":"10","y":"11","z":"12"}},"c":"3"}

0 commit comments

Comments
 (0)