Bir foreach döngüsü (PHP) referans alınarak birden çok değişken geçmek

3 Cevap php

Scenario/Problem Isolation: benim program BİRDEN değişkenler kullanan varsayalım sağlar. Program başında ben daha sonra özel fonksiyonlar sadece farklı birkaç değişken kullanarak sürecinde önce, AT ONCE KÜÇÜK KOD genel fonksiyonu sayesinde değişkenlerin birçok işlemek istiyorum.

Question: Nasıl bir foreach döngü referans birden fazla değişken geçirmek? Veya birden fazla kararlı değişkenler döngü için daha iyi bir alternatif / yöntem var mıdır?

Post(s) related to topic, ama benim sorunu çözmezse:

http://stackoverflow.com/questions/1186274/php-foreach-loop-on-multiple-objects

Background (for those concerned): bu nedenle ben yaklaşık 20 değişken olsun, Getopts http://hash-bang.net/2008/12/missing-php-functions-getopts/ çeşitli argümanları almak için kullandığı bir komut satırı programı var. Ben (yerine işlevini 10 kez çağrı) KEZ at "genel" fonksiyonu reduceHierarchyDots () aracılığıyla dosya yolunu (ler) içeren tüm değişkenleri, (yaklaşık 10) çalıştırmak istiyorum.

<?php

/// The "general" function:

function reduceHierarchyDots ($file) {
    while (preg_match('|./\.{2}/|', $file)) { $file = preg_replace('|/([^/]+)/\.{2}/|', '/', $file, 1); }
    $file = preg_replace('|(/(\./)+)|', '/', $file);
    $file = preg_replace('|^(\./)+|', '', $file);
    return $file;
}

function reduceHierarchyDotsRef (&$file) {
    while (preg_match('|./\.{2}/|', $file)) { $file = preg_replace('|/([^/]+)/\.{2}/|', '/', $file, 1); }
    $file = preg_replace('|(/(\./)+)|', '/', $file);
    $file = preg_replace('|^(\./)+|', '', $file);
}

/// The "many" variables:

$x = "something";
$y = 123;
$y = array ("a", "B", 3);
$a = "/Users/jondoe/Desktop/source/0.txt";
$b = "/Users/jondoe/Desktop/source/../1.txt";
$c = "/Users/jondoe/Desktop/source/../../2.txt";
$arrOne = array (
    "v1" => "/some/thing/../1.pdf",
    "v2" => "/some/thing/../../2.pdf",
    "v3" => "/some/thing/../../../3.pdf"
);
$arrTwo = array (
    "./1.doc",
    "/so.me/.thing/ends./././2.doc",
    "./././3.doc"
);

/// At the beginning I want to run multiple determined variables through a "general" function:

/// Debugging: Variables BEFORE the manipulation:
echo("BEFORE:\n"); var_dump($b, $arrOne["v2"], $arrTwo[2]); echo("\n");

/// Method works, but is long! (1 line/statement per function call)
reduceHierarchyDotsRef($b);
reduceHierarchyDotsRef($arrOne["v2"]);
reduceHierarchyDotsRef($arrTwo[2]);

/// Hence, I'd like to pass all variables by reference at once to a foreach loop:
//// These cause: Parse error: syntax error, unexpected '&':
// foreach ( array($b, $arrOne["v2"], $arrTwo[2] ) as &$file) { $file = reduceHierarchyDots($file); }
// foreach (array(&$b, &$arrOne["v2"], &$arrTwo[2] ) as &$file) { $file = reduceHierarchyDotsRef($file); }
//// These have no effect on the intended variables:
// foreach (array(&$b, &$arrOne["v2"], &$arrTwo[2] ) as $file) { $file = reduceHierarchyDots($file); }
// foreach (array(&$b, &$arrOne["v2"], &$arrTwo[2] ) as $file) { $file = reduceHierarchyDotsRef($file); }

/// Debugging: Variables AFTER the manipulation:
echo("AFTER:\n"); var_dump($b, $arrOne["v2"], $arrTwo[2]);

/// After the "general" function ran over various variables, the more specific actions happen: ...

?>

3 Cevap

Sen sonra kullanarak, değişken isimlerinden oluşan bir dizi üreten deneyebilirsiniz variable variables:

$x = '/bees/../ham';
$y = 'some/other/path';

$arr = array('x', 'y');

foreach($arr as $item) {
    reduceHierarchyDotsRef($$item);
}

Bu referans ile geçirerek çalışır, ama o iş için değil ben değil neden görürseniz emin değil.

Referans olarak geçmek işlev imza tanımlanır:

function func(&$passByRef);

Kodunuzu hatalar atma sebebi buydu.

Bkz: http://php.net/manual/en/language.references.pass.php

Bir işleve argümanların rastgele bir dizi geçen sadece referans değerleri alamaz (ki) func_get_args üzerinden çalışır. En iyi çözüm bir dizi içinde değerleri saklamak ve referans dizi geçmektir.

Hala, bireysel değişkenler olarak değerlere erişebilir anahtar / değer çiftleri kullanarak bunları saklamak ve işlevine geçirilen oldu sonra sonra () dizi ayıklamak istiyorum.

<?php

function test(&$array) {
  /* foreach($array) ... */
}

$ar['x'] = "something";
$ar['y'] = 123;

test($ar);

extract($ar); // pull key/values into the local symbol table

echo $x;
echo $y;
?>

>