تبدیل آرایه به CSV در #PHP
function array2csv($input, $delimiter = ',', $enclosure = '"')#بکاند #آرایه #CSV #سطح_پیشرفته
{
$fp = fopen('php://temp', 'r+');
fputcsv($fp, $input, $delimiter, $enclosure);
rewind($fp);
$data = fread($fp, 1048576);
fclose($fp);
return rtrim($data, "\n");
}
در #Javascript برای پیداکردن بیشترین مقدار در یک آرایه لازم نیست حتما از حلقه استفاده کنید. فقط آرایه رو با استفاده از spread operator ها به تابع ()Math.max پاس بدید:
#سطح_متوسط #spread_syntax
let values = [1, 999, 2];می تونید اعداد دیگه رو هم برای مقایسه با مقادیر آرایه اضافه کنید
Math.max(...values);
Math.max(...values, 1000, 998);یکی از کاربردهای این ترفند می تونه تعیین مقدار پیش فرض برای متغیرها باشه. در این مثال اگر عدد مثبت پیدا نشد مقدار پیش فرض صفر داده میشه
let negatives = [-123, -456, -789];
const aValue = Math.max(...negatives, 0);#سطح_متوسط #spread_syntax
👍1
در #CSS با این روش میتوانید هر جایی از صفحه را کاری کنید که با ماوس قابل انتخاب کردن نباشد:
.no-select {
-moz-user-select: -moz-none;
-moz-user-select: none;
-o-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
#فرانتاند #سطح_متوسط👍1
تابع ()setState در #react بصورت ناهمگام (asynchronous) اجرا می شود و باعث مشکلاتی می شود بعنوان مثال:
this.setState({count: this.state.count + 1});
this.setState({count: this.state.count + 1});
this.setState({count: this.state.count + 1});
// this.state.count === 1, not 3
برای حل این مشکل یک تابع به ()setState پاس بدید:this.setState(prevState => ({ count: prevState.count + 1 }));
#سطح_متوسطتبدیل اعداد فارسی به انگلیسی در #javascript
const digits = '۰۱۲۳۴۵۶۷۸۹';
digits.replace(/[\u0660-\u0669\u06f0-\u06f9]/g,
function(c) {
return c.charCodeAt(0) & 0xf;
});
#کار_با_اعداد #سطح_متوسط❤1
روشی برای پاس ندادن پارامترهای میانی در #javascript
function method (p1, p2, p3, p4) {
console.log(
`${p1} ${p2} ${p3} ${p4}`);
}
method(...['first', , , 'last']);
#spread_syntax #سطح_متوسطهتوسط این تابع در #PHP میتوان چک کرد که آدرس #ایمیل وارد شده صحیح است یا خیر؟
#بکاند #سطح_پیشرفته
function isValidEmail($email)نکته: این تابع DNS سایت ارائه دهنده ایمیل را چک میکند تا آدرس ایمیل fake نباشد.
{
// Check email format
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
list($user, $host) = explode("@", $email);
//check, if host is accessible
if (!checkdnsrr($host, "MX") && !checkdnsrr($host, "A")) {
return false;
}
return true;
}
#بکاند #سطح_پیشرفته
هر دوی این توابع در #javascript اعداد انگلیسی را به فارسی تبدیل می کنند البته با این تفاوت که تابع دوم کلیه حروف بجز اعداد را از رشته وردی حذف می کند:
تابع اول:
تابع اول:
function toFarsiNumber(n) {
const farsiDigits =
['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
return n
.toString()
.replace(/\d/g, x => farsiDigits[x]);
}
تابع دوم:function toFarsiNumber(n) {
const farsiDigits =
['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
return n
.toString()
.split('')
.map(x => farsiDigits[x])
.join('');
}
خروجی تابع اول:toFarsiNumber('Two or 2 ?'); // Two or ۲ ?
خروجی تابع دوم:toFarsiNumber('Two or 2 ?'); // ۲
#سطح_متوسطچرا در #javascript باید یجای اپراتورهای '==' و '===' از ()Object.is استفاده کنیم؟
به خروجی این شرط ها نگاه کنید:
به خروجی این شرط ها نگاه کنید:
0 == ' ' //trueشاید برای حل این مشکل از اپراتور '===' بجای '==' استفاده می کنید اما این راه حل همه جا جواب نمیده، بعنوان مثال:
null == undefined //true
[1] == true //true
NaN === NaN //falseدر حالیکه خروجی ()Object.is برای تمام موارد مقدار قابل قبول تری هست:
Object.is(0 , ' '); //false
Object.is(null, undefined); //false
Object.is([1], true); //false
Object.is(NaN, NaN); //true
#سطح_متوسط👍1
استفاده از اپراتور + قبل از مقادیر در #javascript معادل استفاده ار تابع ()Number است:
0 === Number(null); // trueخروجی مقادیر پایین معادل خروجی تابع ()Number بجای اپراتور + است:
console.log(+'123'); // 123#سطح_مبتدی
console.log(+null); // 0
console.log(+true); // 1
console.log(+false); // 0
console.log(+[]); // 0
console.log(+[123]); // 123
console.log(+new Date); // 1527790306576
👍1
یک مثال از کاربرد تیپ قبلی: زمانی که نیاز به مقایسه مقادیر با ورودی های یک وب فرم مثل المنت های input، select و ... هستیم.
#سطح_مبتدی #javascript
let today = new Date();
if (+form.month.value == (today.getMonth() + 1) &&
+form.day.value == today.getDate()) {
// happy birthday 🎂
// ...
}
روشی جالب برای استفاده از دستور Switch Case در #PHP
$age = 15;#بکاند #سطح_متوسط
switch (true){
case ($age >= 1 && $age <= 12):
echo 'Child';
break;
case ($age >= 13 && $age <= 19):
echo 'Teenager';
break;
case ($age >= 20):
echo 'Adult';
break;
}
حذف مقادیر تکراری از آرایه بدون استفاده از حلقه ها : #javascript
روش اول:
روش اول:
let noDupe = (arr) =>ٰروش دوم: استفاده از Set و #spread_operator که در ES2015 اضافه شده اند ( برای کار در IE و یا نسخه های پایین Firefox و Chrome نیاز به transpiler دارید)
arr.filter((item, i) =>
arr.indexOf(item) >= i);
const noDupe = arr => [...new Set(arr)];
خروجی هر دو روش:noDupe([1,2,2,1,3]); //[1,2,3];
#سطح_متوسط #spread_syntaxدر #php برای پردازش یک آدرس #URL نیازی به نوشتن #Regex نیست و میتوان از توابع موجود استفاده کرد.
برای بدست آوردن قسمت های مختلف یک آدرس URL میتوان از دستور زیر استفاده کرد:
برای بدست آوردن قسمت های مختلف یک آدرس URL میتوان از دستور زیر استفاده کرد:
$url = 'http://example.com/path1/path2?var1=1000&var2=ali';یا اگر فقط قسمت خاصی از URL را نیاز داشتید:
$parsed = parse_url($url);
// Output:
// array (
// 'scheme' => 'http',
// 'host' => 'www.example.com',
// 'path' => '/path1/path2',
// 'query' => 'var1=1000&var2=ali'
// )
$parsed = parse_url($url, PHP_URL_HOST);#بکاند #سطح_متوسط
// Output: example.com
Tip Code
در #php برای پردازش یک آدرس #URL نیازی به نوشتن #Regex نیست و میتوان از توابع موجود استفاده کرد. برای بدست آوردن قسمت های مختلف یک آدرس URL میتوان از دستور زیر استفاده کرد: $url = 'http://example.com/path1/path2?var1=1000&var2=ali'; $parsed = parse_url($url);…
همچنین برای پردازش QueryString نیز میتوان از توابع داخلی #php استفاده کرد:
$url = 'http://www.example.com/path1/path2?var1=1000&var2=ali';#بکاند #سطح_متوسط
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);
var_dump($query);
var_dump($params);
// Output1: var1=1000&var2=ali
// Output2:
// array (
// 'var1' => '1000',
// 'var2' => 'ali',
// )
گارانتی تکرار درست تایمرها در #javascript
از اونجایی که کلیه دستورات javascript تنها در یک thread اجرا می شوند، هیچگونه گارانتی برای اجرای دستورات ()setInterval در interval مشخص شده وجود ندارد. چرا که شاید مدت زمان اجرای دستورات داخل setInterval بیشتر از مدت زمانِ interval تعیین شده باشد و در این صورت تایمرهای بعدی به صف دستورات در javascript اضافه نخواهند شد تا کار تایمر قبلی تمام و از صف دستورات خارج شود.
همچنین ممکن است در بعضی موارد چند تایمر بلافاصله (بدون وقفه) بعد از هم اجرا شوند چرا که interval تعیین شده برای اجرای مجدد تایمر به مدت زمانِ صرف شده جهت اجرای دستورات داخل تایمر نزدیک بوده است.
برای حل این مشکل از دو دستور setTimeout و arguments.callee به شکل پایین استفاده می کنیم:
از اونجایی که کلیه دستورات javascript تنها در یک thread اجرا می شوند، هیچگونه گارانتی برای اجرای دستورات ()setInterval در interval مشخص شده وجود ندارد. چرا که شاید مدت زمان اجرای دستورات داخل setInterval بیشتر از مدت زمانِ interval تعیین شده باشد و در این صورت تایمرهای بعدی به صف دستورات در javascript اضافه نخواهند شد تا کار تایمر قبلی تمام و از صف دستورات خارج شود.
همچنین ممکن است در بعضی موارد چند تایمر بلافاصله (بدون وقفه) بعد از هم اجرا شوند چرا که interval تعیین شده برای اجرای مجدد تایمر به مدت زمانِ صرف شده جهت اجرای دستورات داخل تایمر نزدیک بوده است.
برای حل این مشکل از دو دستور setTimeout و arguments.callee به شکل پایین استفاده می کنیم:
setTimeout(function(){
// code
setTimeout(arguments.callee, interval);
}, interval);
برای دوستانی که از قبل با arguments.callee آشنایی ندارند: arguments.callee یک اشاره گر (Pointer) به تابع در حال اجرا است (بعبارت دیگر اشاره گر به تابعی است که مالک arguments است).یکی از کاربردهای تیپ قبلی در پیاده سازی انیمیشن ها در #javascript است چرا که انیمیشن باید بصورت نرم (smooth) اجرا شود و تاثیر انیمیشن قابل مشاهده باشد.
setTimeout(function(){
var div = document.getElementById('aDiv'),
right = parseInt(div.style.right) + 5;
div.style.right = right + 'px';
if (right < 150)
setTimeout(arguments.callee, 50);
}, 50);
این تایمر باعت حرکت div از راست به چپ در هر بار اجرای تایمر می شود تا زمانی که فاصله div از سمت راست به 150px و یا بیشتر برسد.سلکتور چشم جغد
در #css سلکتوری وجود دارد به نام چشم جغد که این صورت تعریف میشود:
کاربرد: معمولا margin-top با border-top به عناصر یک لیست.
مثال:
در #css سلکتوری وجود دارد به نام چشم جغد که این صورت تعریف میشود:
* + * {
}
معنی: تمام المنتهایی که قبل از آنها المنت دیگری وجود دارد.کاربرد: معمولا margin-top با border-top به عناصر یک لیست.
مثال:
.myList *+* {
margin-top: 1em;
}
#سطح_متوسطThis media is not supported in your browser
VIEW IN TELEGRAM
بیشتر اوقات هنگام استفاده از #Console در #DevTools مرورگرها نیاز داریم از خروجی دستور قبلی در اجرای دستور بعدی استفاده کنیم. برای اینکار از _$ استفاده کنید
این دستور در هر سه مرورگر Safari، Firefox و Chrome قابل دسترس هست (در دیگر مرورگرها تست نشده)
#سطح_متوسط #javascript
این دستور در هر سه مرورگر Safari، Firefox و Chrome قابل دسترس هست (در دیگر مرورگرها تست نشده)
#سطح_متوسط #javascript
برنامه نویسان #PHP نمیتوانند بلافاصله بعد از ایجاد Instant از روی کلاس، به عناصر داخل آن دسترسی داشته باشند:
// syntax errorدر عوض مجبور هستند که کد خود را در دو خط بنویسند:
new myClass()->myMethod();
$a = new myClass();اگر میخواهید عمل فوق را در یک خط انجام دهید، باید به این صورت عمل کنید:
$a->myMethod();
(new myClass())->myMethod();
#بکاند #سطح_مبتدی