• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
خواندن متغیر های داخل یک فانکشن
#1
سلام،

من دو سوال زیر رو دارم.

1. من سه انتخاب و با نام های gender1 تا gender3 دارم و در روبروی هر یک از آنها یک فیلد با نام first_field تا third_field دارم. در انتخاب ها دو مقدار وجود داره. یکی boy و دیگری girl . میخوام چک کنم که اگر برای فیلد مثلا اولی گزینه فرضاً girl انتخاب شد مقداری که در فیلد اولی قرار داده رو در متغیر $firl_names وارد کنه و به همین ترتیب. پس در نهایت متغیر $boy_names یک آرایه میشه با سه مقدار!
من برای اینکار اومدم از switch استفاده کردم و کدی مثل زیر نوشتم:
کد پی‌اچ‌پی:
swtich$_POST['gender1'] ){
case 
'boy':
$boy_names = array( => "$first_field);
break;

case 
'girl':
$girl_names = array( => "$first_field);
break;

default:
break;

مشکلی من هنوز با طرز نوشتن این کد مشکلی پیدا نکردم چون قبل اون، فانکشن ShowResult حتی اگر از global برای دو متغیر boy_names و girl_names استفاده کنم باز خطا میده که این دو متغیر شناخته شده نیست. پس اینجا سوال من این است که چطور میتونم متغیر های داخل یک function یا حتی خارج اون اما درون یک if یا ... رو فراخوانی کنم در یکجای دیگر؟

2. نحوه صحیح وارد مقدار بصورت آرایه به یک متغیر چگونه است؟ آیا نیاز هست که اول بیاییم متغیر رو با آرایه با مقدار خالی تعریف کنیم؟ یعنی چیزی مثل زیر:
کد پی‌اچ‌پی:
$boy_names = array();
$girl_names = array(); 

3. حتماً مشکل اصلی من رو متوجه شدید. مثلا من آگاهی از فلان چیز ندارم درست مثل طرز خواندن کد های php که در تاپیکی عرض کردم.

ممنونم
غایب
  پاسخ
تشکر شده توسط :
#2
اینجا که من زیاد نفهمیدم برنامت چی کار می کنه!
---------
متغییر های تو فانکشن که با فانکشن شروع می شن و با فانکشن تموم مگه اینکه تابع اون مقدار هارو برگردونه غیر این که بی معنی که اصلا به متغییر های توی تابع دسترسی داشته باشیم!!!
----

برای آراییه هم چون در طول برنامه بهش مقدار می دی ظاهرا بهتره به این صورت عمل کنی!
کد پی‌اچ‌پی:
$ary = array();

//---
$ary[1] = 'value 01';

//--
$ary[2] = 'value 02';

//--
//... 

نقل قول:پس در نهایت متغیر $boy_names یک آرایه میشه با سه مقدار!
یعنی هرسه گزینه رو باید مثه هم وارد کنه که boy می شه سه تا!!!

----
ShowResult چه تابعیه؟!

----
مثلا این چطوره؟!
کد پی‌اچ‌پی:
$boy = array();
$girl = array();

//---
if($post['g1'] == 'boy')
    
$boy[1] = 'v1';
elseif(
$post['g1'] == 'girl')
    
$girl[1] = 'v1';

//---
if($post['g2'] == 'boy')
    
$boy[2] = 'v2';
elseif(
$post['g2'] == 'girl')
    
$girl[2] = 'v2';

//---
if($post['g3'] == 'boy')
    
$boy[3] = 'v3';
elseif(
$post['g3'] == 'girl')
    
$girl[3] = 'v3';


//---
echo print_r($boy1).'<HR>'.print_r($gril1); 
  پاسخ
تشکر شده توسط :
#3
من طور دیگه این راهی که تو میگی رو رفتم اما جواب نداد اما باز اینم امتحان کردم و خروجیش Array() بود! این کل کد منه.
کد پی‌اچ‌پی:
<?php

echo<<<html
<html>
<head>
<title>صفحه تمرین علیرضا - دسته بندی نام ها</title>
<link rel="stylesheet" href="style.css" title="css for all contents" media="all" />
</head>
<body>
html;

//Variables
$first_field $_POST['first_field'];
$second_field $_POST['second_field'];
$third_field $_POST['third_field'];

    
//Check if there is an error show it
function CheckError(){
    global 
$first_field$second_field$third_field;
    
    if( isset( 
$_POST['finished'] ) ){
        
        if( empty( 
$first_field ) || empty( $second_field ) || empty( $third_field ) ){
             echo( 
"<p><strong>خطا:</strong> پر کردن فیلد های ستاره دار الزامی است</p><p><input type=\"submit\" value=\"بازگشت\" class=\"submit\" onclick=\"history.go(-1)\" /></p>" );
        }
        
        elseif( 
is_numeric($first_field) || is_numeric($second_field) || is_numeric($third_field) ){
             echo( 
"<p><strong>خطا:</strong> مقادیر فیلد ها نمی تواند عدد باشد</p><p><input type=\"submit\" value=\"بازگشت\" class=\"submit\" onclick=\"history.go(-1)\" /></p>" );
        }
        
        else{
            
ShowResult();
        }
    }
}

CheckError();
    

//If there are no errors show result
function ShowResult(){
    global 
$first_field$second_field$third_field;
        
$boy_names = array();
$girl_names = array();

//---
if($_POST['gender1'] == 'boy')
    
$boy_names[1] = "$first_field";
elseif(
$_POST['gender1'] == 'girl')
    
$girl_names[1] = "$first_field";

//---
if($_POST['gender2'] == 'boy')
    
$boy_names[2] = "$second_field";
elseif(
$_POST['gender2'] == 'girl')
    
$girl_names[2] = "$second_field";

//---
if($_POST['gender3'] == 'boy')
    
$boy_names[3] = "$third_field";
elseif(
$_POST['gender3'] == 'girl')
    
$girl_names[3] = "$third_field";


//---
echo print_r($boy_names1).'<HR>'.print_r($girl_names1); 
    
    
$n_names = array( 'نام های پسر' => $boy_names'نام های دختر' => $girl_names );
    
    
    foreach( 
$n_names as $titles => $names ){
        echo( 
"<h2>{$titles}</h2>" );
        
        echo( 
"<ul>" );
        foreach( 
$names as $numbers => $list ){
            echo( 
"<li>{$list}</li>" );
        }
        echo( 
"</ul>" );
    }
    
}

function 
GetSex(){
    


    
    
/*$boy_names = array();
    $girl_names = array();
    
    switch( $_POST['gender1'] ){
        case 'boy':
        $boy_names = "$first_field";
        break;
        
        case 'girl':
        $girl_names = "$first_field";
        break;
        
        default:
        break;
    }
    
    switch( $_POST['gender2'] ){
        case 'boy':
        $boy_names = "$second_field";
        break;
        
        case 'girl':
        $girl_names = "$second_field";
        break;
        
        default:
        break;
    }
    
    switch( $_POST['gender3'] ){
        case 'boy':
        $boy_names = "$third_field";
        break;
        
        case 'girl':
        $girl_names = "$third_field";
        break;
        
        default:
        break;
    }*/
}

?>
غایب
  پاسخ
تشکر شده توسط :
#4
به نظرم که باید برنامه این شکلی باشه:
یه فرم که سه تا فیلد داره برای اینکه اسم ( نام کوچک یا یه چیزی تو این مایه ها ) وارد به شه و برای هر فیلد هم با رادیو باتن مشخص به شه که این اسم پسره یا دختر!!! Blush
حالا تو می خوای که توی یک آرایه این اسامی رو طبق جنسیت تو دوتا آرایه قرار بدی...
---

این کدیه که من نوشتم
کد پی‌اچ‌پی:
<?PHP

if(noError()){
    
$names getNames();
    
    
// list of boy names
    
$html '<h2>'.'نام های پسر'.'</h2>'
        
.'<ul>';
    foreach(
$names['boyNames'] as $name){
        
$html .= '<li>'.$name.'</li>';
    }
    
$html .= '</ul>';

    
// list of girl names
    
$html .= '<h2>'.'نام های دختر'.'</h2>'
        
.'<ul>';
    foreach(
$names['girlNames'] as $name){
        
$html .= '<li>'.$name.'</li>';
    }
    
$html .= '</ul>';
    
    echo 
$html;    
}

// functions

// check form error
function noError()
{
    if(isset(
$_POST['finished'])){
        if(empty(
$_POST['first_field']) ||
            empty(
$_POST['second_field']) ||
            empty(
$_POST['third_field'])){
            echo 
'Error! empty Fields!';
            return 
false;
        }
        if(
is_numberic($_POST['first_field']) ||
            
is_numberic($_POST['second_field']) ||
            
is_numberic($_POST['third_field'])){
            echo 
'Error! numberic value isnt valid!';
            return 
false;
        }
    }
    else{
        echo 
'Error! resend Form';
        return 
false;
    }
    return 
true;
}

// list of names
function getName()
{
    
$names = array();
    
$names['boyNames'] = array();
    
$names['girlNames'] = array();

    if(
$_POST['gender1'] == 'boy')
        
$names['boyNames'][] = $_POST['first_field'];
    else(
$_POST['gender1'] == 'girl')
        
$names['girlNames'][] = $_POST['first_field'];

    if(
$_POST['gender2'] == 'boy')
        
$names['boyNames'][] = $_POST['second_field'];
    else(
$_POST['gender2'] == 'girl')
        
$names['girlNames'][] = $_POST['second_field'];

    if(
$_POST['gender3'] == 'boy')
        
$names['boyNames'][] = $_POST['third_field'];
    else(
$_POST['gender3'] == 'girl')
        
$names['girlNames'][] = $_POST['third_field'];
    
    return 
$names;
}
?>

تابع checkError تو تغییر پیدا کرده به تابع noError
noError با برگردونن true یا false اجازه نمی ده که درصورت خطلا داشتن اطلاعات برنامه ادامه پیدا کنه

تابع showResult هم عوض شده به getName
getName یک آرایه دوبعدی بر می گردونه که یک بعدش مربوط می شه به boyNames و بعد دیگه girlNames که هرکدون از اینها هم ارایه ایی هستند از اسم ها

----
نقل قول:باز اینم امتحان کردم و خروجیش Array() بود!
علتش اینه که تو یه آرایه رو echo کردی حالتی شبیه به این
کد پی‌اچ‌پی:
$a = array();
echo 
$a
این جور مواقع همیشه خروجی فقط یک Array هست

یه چیزه دیگه هم که هست اونم global
$_POST خودش سراسری و global هست دیگه لازم نیست که تویه متغیر دیگه گذاشته بشن و دوباره global بشن
اگه از همین $_POST استفاده کنی بهتره! اینطور نیست؟Cool
  پاسخ
تشکر شده توسط : cyletech
#5
عذر میخوام، من تازه امروز فرصت کردم به این تاپیک خودم برسم. من کدت رو چک کردم و یکسری ایرادات جزئی داشت که مطمئنم میدونستی اما فراموش کردی در اون لحظه برای همین من اونا رو لیست کردم برات و در آخر نتیجه رو میگم:
  1. esle مانند if و elseif هیچ مقداری نمیگیره تا بررسی کنه!
  2. تابعی بنام is_numberic نداریم به احتمال زیاد منظورت is_numeric هست
  3. شما یک تابع نوشتی به نام getName اما در جای دیگه اشتباه نوشتی getNames که باعث بروز خطا می شه
  4. اگر بخوایم از شرط های طولانی یا زیاد استفاده کنیم برای امنیت و بهینه بودن بیشتر از switch استفاده می کنیم
در نهایت هم محمد امین جان، خروجی کد شما درست مثل خروجی کد من است. یعنی تنها عناوین رو به نمایش میگذاره و از قرار دادن زیرمجموعه ها که اسامی باشند صرف نظر می کنه. ببینید من کمی در مورد کاری که میخوام انجام بدم برات توضیح میدم ببین متوجه منظورم میشی. من دو متغیر با چند تا مقدار برای هر کدوم دارم و یک متغیر دیگری دارم که اون دو متغیر اولی رو در بر داره و من میخوام با دو foreach که اولی مربوط میشه به نمایش عناوین که مقادیر متغیر سوم هست و دومی هم مربوط میشه به شکافتن متغیر سوم که مقادیر اصلیش همان متغیر های اول و دوم هستند...
غایب
  پاسخ
تشکر شده توسط :
#6
در مورد اون چارتا مورد حق با توه

اما در مورد خروجیش فک کنم درست عمل کردم دیگه
دوتا ارایه اسم هستن که حداقل 0 و حداکثر 3 تا اسم دارم. یه ارایه مربوطه به پسرها و یه ارایه هم مربوطه به دختر ها
که تو دوتا لیست جدا نمایش داده می شن!!!

نقل قول:یعنی تنها عناوین رو به نمایش میگذاره و از قرار دادن زیرمجموعه ها که اسامی باشند صرف نظر می کنه
به احتمال زیاد کده مربوط به formت مشکل داره
یه بازنگری اونجا بکن! یا بزار اینجا تا بازنگری بکنیم!Wink
  پاسخ
تشکر شده توسط :
#7
برادر من، اگر کد نوشته شده html مشکلی داشت که در صورت وارد نکردن اطلاعات یا عدد بودن مقدار وارد شده در فیلد ها خطا نمی داد! مگر در html چیزی جز gender1 تا gender3 و first_field تا third_field دارین؟ نه عزیرم من دوباره چک کردم. میدم دست خودت بررسی کن.
کد:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>صفحه تمرین علیرضا - معرفی و دسته بندی نام ها</title>
<link rel="stylesheet" href="style.css" title="css for all contents" media="all" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="functions.php" method="post">
<fieldset>
<legend>معرفی نام ها</legend>
<p><span class="important">*</span>&nbsp;<strong>نام نخست:</strong>&nbsp;&nbsp;<select name="gender1"><option name="boy">پسر</option><option name="girl">دختر</option></select>&nbsp;-&nbsp;<input type="text" size="15px" maxlength="32" name="first_field" /></p>
<p><span class="important">*</span>&nbsp;<strong>نام دوم:</strong>&nbsp;&nbsp;<select name="gender2"><option name="boy">پسر</option><option name="girl">دختر</option></select>&nbsp;-&nbsp;<input type="text" size="15px" maxlength="32" name="second_field" /></p>
<p><span class="important">*</span>&nbsp;<strong>نام سوم:</strong>&nbsp;&nbsp;<select name="gender3"><option name="boy">پسر</option><option name="girl">دختر</option></select>&nbsp;-&nbsp;<input type="text" size="15px" maxlength="32" name="third_field" /></p>
<p><i><span style="color: #900; font-weight: bold;">*</span>پر کردن فیلد های ستاره دار الزامی است</i></p>
<p><input class="submit" type="submit" name="finished" value="دسته بندی نام ها" /></p>
</fieldset>
</form>
</body>
</html>
غایب
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان