PDA

View Full Version : ویرایش خروجی تابع json_encode (حذف دابل کتیشن)



snhasani
شنبه 23 شهریور 1392, 11:02 صبح
یه کوئری از دیتابیس میگیرم به قرار زیر. که فیلد اول زمان و دومی هم عدد.

$result = mysql_query("SELECT UNIX_TIMESTAMP(STR_TO_DATE(`date`, ('%Y-%m-%d')))*1000, `sell` FROM `usd` ORDER BY `date` ASC");
حالا وقتی با دستورهای زیر واکشی می کنم و به صورت دیکد شده json می فرستمش نمی خوام اون دابل کتیشن ها مقادیر آرایه رو احاطه منه و به نوعی تابع json_decode اینا رو استرینگ فرض کنه

while ($row = mysql_fetch_array($result)) {
$arr[] = "[" . $row{"UNIX_TIMESTAMP(STR_TO_DATE(`date`, ('%Y-%m-%d')))*1000"}. ', ' . floatval($row{'sell'}) . "]";
}

echo json_encode($arr);
نتیجه:

["[1347564600000, 2.35]","[1348086600000, 9.37]","[1349814600000, 3.51]"]
من می خوام نتیجه این مدلی در بیاد (بدون دابل کتیشن)
[[1347564600000, 2.35],[1348086600000, 9.37],[1349814600000, 3.51]]

Javidhb
شنبه 23 شهریور 1392, 16:23 عصر
با این کد، شما دارید string درست میکنید.. که طبیعیه بعدن توی اینکود بین double quotation قرار بگیره...
برای چیزی که شما میخاید میتونید از
str_replace('"','',$str); استفاده کنید.

اما راه بهتر (تست نشده):


$arr = array();
while ($row = mysql_fetch_array($result)) {
$tempArray = array(); //Araye Movagati
$tempArray[] = $row{"UNIX_TIMESTAMP(STR_TO_DATE(`date`, ('%Y-%m-%d')))*1000"};
$tempArray[] = floatval($row{'sell'});
$arr[] = $tempArray;
}

echo json_encode($arr);

snhasani
شنبه 23 شهریور 1392, 21:53 عصر
من توی php تازه کارم. روش اول امتحان کرده بودم که جواب نداد. چون این تابع json_encode که به مقادیر رشته ای کوتیشن اختصاص میده! تنها وقتی مقداری رو داخل کوتیشن حصر نمی کنه بدونه عدد.
راه دومتونم هم جواب نداد. چون در اصل تفاوتی ایجاد نشده. و مقدار اصلی که همون تاریخ باشه به صورت رشته ای. مشکلم همین جاست به نظر من!
اما در رابطه با حل مسئله به خاطر آمپاس وقت از خیر تابع json_encode گذشتم و مقادیر آرایه رو خودم به صورت رشته ای که تابع مقصد بتونه بفهمه براش ارسال کردم. هرچند بهینه نبود ولی در اون زمان کار راه انداخت :) اینطوری:

while ($row = mysql_fetch_array($result)) {
$arr[] = "[" . $row{'(`date`)*1000'}. ', ' . floatval($row{'AVG(`sell`)'}) . "]";
}
$data = "";
$last_key = key( array_slice( $arr, -1, 1, TRUE ) );

while (list($key, $value) = each($arr)) {
if ($key != $last_key)
$data = $data . "$value, ";
else
$data = $data . "$value";
}

echo "[" . $data . "]";
هر چند در ویرایش نهایی مقدار تاریخ رو از اونجایی که به صورت unix timespan برگشته داده می شد و تماماً عدد بود؛ با یه تغییر کوچیک توی کد شما رشته به عدد تبدیل کردم و پاسش دادم.

$tempArray[] = floatval($row{"(`date`)*1000"});
در هر صورت از پاسختون بسیار ممنونم.

2undercover
یک شنبه 24 شهریور 1392, 05:05 صبح
توی Options های تابع json_encode یکیشون JSON_NUMERIC_CHECK هست که باعث میشه اگه توی رشته تون فقط کاراکتر عددی بود اون رو به صورت عدد Encode بکنه (بدون دابل کوتیشن). یعنی شما تابع json_encode رو اینجوری بنویسید:



json_encode($arr, JSON_NUMERIC_CHECK);