Bir işlev içine bir dizi geçmek ve bir dizi ile sonuç nasıl

7 Cevap

Ben de birden çok değer döndürmek için PHP'nin yetersizlik etrafında alabilirsiniz, böylece fonksiyonu sayesinde diziler geçmek öğrenmek için çalışıyorum. Şimdiye kadar çalışmak için bir şey almak mümkün olmuştur, ama burada benim iyi bir deneyin değil. Ben yanlış gidiyorum herkes nereye işaret edebilir?

function foo($array)
{
    $array[3]=$array[0]+$array[1]+$array[2];
    return $array;
}

$waffles[0]=1;
$waffles[1]=2;
$waffles[2]=3;
foo($waffles);

echo $waffles[3];

Açıklama için: Ben ayrı tutarken geri dışarı birden çok değişken dönmek, sonra bir şeyler yapmak, bir fonksiyon içine birden çok değişken geçmek mümkün olmak istiyorum. Bu benim bir diziden birden çok değişken dönmek mümkün olmadığı için geçici bir çözüm olarak çalışma almak için çalışıyordu sadece bir örnek oldu

7 Cevap

Sen arıyor gibi görünüyor pass-by-reference, bu senin, bu yolla işlev (işareti not) görünmesi yapmak için:

function foo(&$array)
{
    $array[3]=$array[0]+$array[1]+$array[2];
}

Alternatif olarak, bir değişken için işlevin dönüş değerini atayabilirsiniz:

function foo($array)
{
    $array[3]=$array[0]+$array[1]+$array[2];
    return $array;
}

$waffles = foo($waffles)

Siz kopya tarafından işlevi dizi geçiyoruz. Sadece nesneler PHP referans geçti ve bir dizi bir nesne değildir vardır. Burada (ve not) ne var

function foo(&$arr) { # note the &
  $arr[3] = $arr[0]+$arr[1]+$arr[2];
}
$waffles = array(1,2,3);
foo($waffles);
echo $waffles[3]; # prints 6

Bu bir yana, ben böyle böyle bir operasyon yapacağını neden emin değilim. Neden sadece yerine yeni bir dizi elemanı için atama toplamını döndürür değil?

Denemek

$waffles = foo($waffles);

Diğer yanıtlar önerilen gibi ya da, referans dizi geçirmek.

Ayrıca, indeks, örneğin yazmadan bir diziye yeni elemanlar ekleyebilirsiniz

$waffles = array(1,2,3); // filling on initialization

veya

$waffles = array();
$waffles[] = 1;
$waffles[] = 2;
$waffles[] = 3;

Bir dizideki tüm değerleri toplamak istiyorsanız bir dipnot düşmek, array_sum() kullanın

i Class biraz overkill olduğunu biliyorum

class Foo
{

 private $sum = NULL;

 public function __construct($array)
 {
   $this->sum[] = $array;
   return $this;
 }

 public function getSum()
 {
   $sum = $this->sum;
   for($i=0;$i<count($sum);$i++)
   {
      // get the last array index
      $res[$i] = $sum[$i] + $sum[count($sum)-$i];
   }
   return $res;
 }


}


$fo = new Foo($myarray)->getSum();

Siz PHP 'birden fazla değer' dönmek mümkün değildir. Sen bir dizi olabilir, tek bir değer döndürebilir.

function giveme($test1, $test2, $test3)
{
    return array($test1, $test2, $test3);
}
$test1 = "1";
$test2 = "2";
$test3 = "3";

$arr = foo($test1, $test2, $test3);

$test1 = $arr[0];
$test2 = $arr[1];
$test3 = $arr[2];

Ben her zaman list() ve array() s bir arada kullanarak birden dönüş değerleri:

function DecideStuffToReturn() {
    $IsValid = true;
    $AnswerToLife = 42;

    // Build the return array.
    return array($IsValid, $AnswerToLife);
}

// Part out the return array in to multiple variables.
list($IsValid, $AnswerToLife) = DecideStuffToReturn();

İstediğiniz ne olursa olsun onları adlandırabilirsiniz. Ben tutarlılık fonksiyonu değişkenleri ve dönüş değişkenleri aynı tutmak için seçtim ama sizin gibi ne olursa olsun onları arayabilirsiniz.

list() Daha fazla bilgi için bkz.

İşte bunu nasıl olduğunu. Bu şekilde aslında birden çok değer dönen taklit bir işlev alabilirsiniz;

function foo($array) 
{ 
    foreach($array as $_key => $_value) 
    {
       $str .= "{$_key}=".$_value.'&';
    }
    return $str = substr($str, 0, -1);
} 

/* Set the variables to pass to function, in an Array */

    $waffles['variable1'] = "value1"; 
    $waffles['variable2'] = "value2"; 
    $waffles['variable3'] = "value3"; 

/* Call Function */

    parse_str( foo( $waffles ));

/* Function returns multiple variable/value pairs */

    echo $variable1 ."<br>";
    echo $variable2 ."<br>";
    echo $variable3 ."<br>";

Especially usefull if you want, for example all fields in a database to be returned as variables, named the same as the database table fields. See 'db_fields( )' function below.

For example, if you have a query

select login, password, email from members_table id = $ id 

Function returns multiple variables:

$login, $password and $email

Here is the function:

function db_fields($field, $filter, $filter_by,  $table = 'members_table') {

 /*
    This function will return as variable names, all fields that you request, 
    and the field values assigned to the variables as variable values.  

    $filter_by = TABLE FIELD TO FILTER RESULTS BY
    $filter =  VALUE TO FILTER BY
    $table = TABLE TO RUN QUERY AGAINST

    Returns single string value or ARRAY, based on whether user requests single
    field or multiple fields.

    We return all fields as variable names. If multiple rows
    are returned, check is_array($return_field); If > 0, it contains multiple rows.
    In that case, simply run parse_str($return_value) for each Array Item. 
*/
    $field = ($field == "*") ? "*,*" : $field;
    $fields = explode(",",$field);

    $assoc_array = ( count($fields) > 0 ) ? 1 : 0;

    if (!$assoc_array) {
        $result = mysql_fetch_assoc(mysql_query("select $field from $table where $filter_by = '$filter'"));
        return ${$field} = $result[$field];
    }
    else
    {
        $query = mysql_query("select $field from $table where $filter_by = '$filter'");
        while ($row = mysql_fetch_assoc($query)) {
            foreach($row as $_key => $_value) {
                $str .= "{$_key}=".$_value.'&';
            }
            return $str = substr($str, 0, -1);
        }
    }
}

Aşağıda çalışması için bir örnek çağrıdır. Yani, biz = 12345 $ User_id söylemek için alanları ile üyeleri tablodan, Kullanıcı Veri almak için kimliği, giriş, parola, e-posta gerekirse:

$filter = $user_id;
$filter_by = "ID";
$table_name = "members_table"

parse_str(db_fields('LOGIN, PASSWORD, EMAIL', $filter, $filter_by, $table_name));

/* This will return the following variables: */

echo $LOGIN ."<br>";
echo $PASSWORD ."<br>";
echo $EMAIL ."<br>";

Biz de böyle diyebiliriz:

parse_str(db_fields('*', $filter, $filter_by, $table_name));

Yukarıdaki arama değişken isimleri gibi tüm alanları dönecekti.