Стойността на променлива от масива да бъде ключа и

nbacool2

Registered
Как мога да задам на даден ключ от масив стойността да бъде самия ключ.Например $abv['KEY'] да бъде KEY . Сещам се, че подобно нещо може да стане с foreach цикъл, но на мен това ми трябва за отделни стойности.

foreach ($arr as $key=>$value) {
$arr[$key] = $key;
}
Искам да питам същото нещо за обикновени променливи.
 
Т.е. искаш ключ и стойност да са ти еднакви(стойността на ключа) ? Или искаш да размениш местата на ключа и стойността. Защото, ако е за размяна ползвай array_flip(), иначе си на прав път с foreach(){} , но какво имаш предвид за определени стойности ?
 
Нужно ми е за мултиезичността. Ако имам един масив $lang[] и в него държа стринговете, но в даден файл се опитам да използвам стринг, който не съществува в масива, вместо да ми принтва whitespace, искам да бъде ключа на несъществуващия стринг. Искам да го направя като функция
function echo_string($string) {
if ( isset($string) ) {
echo $string;
}
else {
echo Ключа;
}
}


echo_string($lang['db_access']);

ако $lang['db_access'] има стойност, тя се принтва, ако няма, да се принтне 'db_access'

Или вариант, който също върши работа.
 
Реално би трябвало да подаваш ключа от масива, за който искаш превод и вероятно езика:

PHP:
//речник на български език
$bg = array("cat"=>"котка", "dog"=>"куче", "monkey"=>"маймуна");

//речник на руски език
$ru = array("cat"=>"кошка", "dog"=>"собака", "monkey"=>"обезьяна");

/**
  * Превод на елемент за съответния език
  *
  * @param string $key Елемент от масива, за който искаме превод
  * @param string $lang Код на езика, на който трябва да бъде преведен елемента
  * return string  Превода на елемента за съответния език или името на елемента при липсващ превод.
  */
function translate($key, $lang){

        //Декларираме като глобален, масива за поискания език
	global $$lang;
	
        //Копираме го в локална променлива за по-нататъшна работа
	$use_lang = $$lang;

        //Ако елемента съществува в масива и стойността му не е празна
        //принтираме превода за съответния език
	if(isset($use_lang[$key]) && !empty($use_lang[$key])){
		echo $use_lang[$key];
	}else{
                //иначе принтираме името на ключа
		echo $key;
	}
}

//преведи cat на български
translate("cat", 'bg'); //котка

//преведи cat на руски
translate("cat", 'ru'); //кошка

//преведи elephant на български
translate("elephant", 'bg'); //elephant 

//преведи elephant на гръцки
translate("elephant", 'gr'); //elephant

Може би трябва да добавиш и проверка за липсващ език, какъвто е последния пример.

Редактирано - не е добра практика функцията да връща резултата с echo, но така беше в твоя пример. По-добре е да ползваш return и после да я принтваш <?php echo translate("cat", "bg"); ?> - понякога може да ти се наложи да преведеш нещо, но да не го принтираш пред потребителя (ако например създаваш текстов файл, който да се запази на сървъра).

Редакция 2 - ако избрания език го пазиш в сесията (най-вероятно), тогава нямаш нужда от втория параметър а го ползвай директно вътре, защото $_SESSION все пак е глобален масив. По същия начин можеш да си направиш масивите с езиците да са глобални масиви:

$_LANG_BG = array();
$_LANG_EN = array();

и отпада нуждата от декларирането им като глобални вътре във функцията при всяко изпълнение на тази функция.
 

Back
Горе