2013-07-12 2 views
0

я наткнулся на код, который я написал несколько лет назад, когда я первый изучение PHP и не знал, что массивы начинаются с 0, а не 1.Получить имя переменной массива

$afc_east[1] = "Buffalo Bills"; 
$afc_east[2] = "Miami Dolphins"; 
$afc_east[3] = "New England Patriots"; 
$afc_east[4] = "New York Jets"; 

$afc_west[1] = "Denver Broncos"; 
$afc_west[2] = "Kansas City Chiefs"; 
$afc_west[3] = "Oakland Raiders"; 
$afc_west[4] = "San Diego Chargers"; 

//.... other divisions... 

//Put all of the arrays into one 
$afc = array($afc_east, $afc_west, $afc_north, $afc_south); 

for($i=0;$i<count($afc);$i++) 
{ 
    $count = count($afc[$i]); 

    for($y=1;$y<=$count;$y++) 
    { 
     // I'd like to find out how to echo "afc_east" or "afc_west" 
     $name_of_array = ""; //Idk 
     echo "$".$name_of_array."[".$y-1."]" = ".$afc[$i][$y].";<br />"; 
    } 

} 

Я хочу чтобы все мои массивы начинались с 0. Но для меня просто слишком много массивов, чтобы вернуться и изменить числа в массивах на один ниже того, что есть в настоящее время. Мне было бы намного проще иметь php echo из имен массивов вместе со своими соответствующими значениями, а затем копировать и вставлять их в текстовый редактор.

+0

Вы должны иметь возможность легко уменьшать все индексы массива в любом текстовом редакторе, который поддерживает макросы. IMO вы должны * не * добавлять счет в учетную запись для индексации на основе «1», поскольку, когда вы в конце концов пройдете и измените массивы на индексы «0», вам будет еще больше работы. – Paulpro

+0

Я использую текстовый ретранслятор. Любая идея, как я должен это делать? – Lance

+0

Вы не можете получить его, используя свой код, вы должны назначать имена вручную, используя что-то вроде '$ afc = array ('afc_east' => $ afc_east, ...' – zerkms

ответ

2

Если все элементы объявлены в правильном порядке, вы можете просто удалить жестко закодированные ключи и пусть PHP перечисление:

$afc_east[1] = "Buffalo Bills"; 
$afc_east[2] = "Miami Dolphins"; 
$afc_east[3] = "New England Patriots"; 
$afc_east[4] = "New York Jets"; 

Становится

$afc_east = array(); // Optional 
$afc_east[] = "Buffalo Bills"; 
$afc_east[] = "Miami Dolphins"; 
$afc_east[] = "New England Patriots"; 
$afc_east[] = "New York Jets"; 

Ваш редактор позволит вам заменить с помощью регулярное выражение, например замените (\$[a-z_]+\[)\d+(\] =) на \1\2.

+0

Это ответ! – bschaeffer

+1

Претензии для определенного регулярного выражения :) Обязательно сделайте это, чтобы найти и заменить полу-вручную, а не делать Замените все, так как было бы легко создать труднодоступную ошибку, заменив неправильную вещь. – Matchu

+0

@Matchu Действительно :) Я * всегда * использую 'Replace and find' при замене регулярным выражением. Приходит из опыта (т. Е. Слишком много времени потрачено на охоту на ошибку, которую я «умно» представил.) – jensgram

0

PHP не предлагает эту функцию. Рассмотрим следующее:

$foo = array("a", "b", "c"); 
$bar = $foo; 

это имя массива foo или bar? И то и другое? Ни? Реальный ответ здесь заключается в том, что массив является его собственным объектом, и он не отслеживает, где он был сохранен. Если вы храните его в другом месте, вы теряете всю информацию о том, какие другие переменные были сохранены.

... вздох. Я уверен, что есть лучший способ сделать это с помощью текстового редактора, но если все, что мы хотим сделать, это настроить ваш код, чтобы он работал так, как ожидалось, мы могли бы использовать ... sheesh, я не могу поверить, что я собираюсь сказать это ... variable variables.

Ниже действительно отрывочный PHP функция, которая мне очень не нравится, но может быть полезным в этом очень конкретной ситуации:

$username = "Matchu"; 
$var_name = "username"; 
echo $$var_name; // echoes "Matchu" 

Вместо того, чтобы хранить массивы в массиве и итерация тех , мы могли бы вместо того, чтобы перебирать имена переменных:

$afc = array("afc_east", "afc_west", "afc_north", "afc_south"); 
foreach($afc as $name_of_array) { 
    $array_value = $$name_of_array; 
    // Ta da, you have the variable name and the array stored in it. Go crazy. 
} 

Я очень, очень настоятельно рекомендую использовать эту функцию в повседневной коде, но, в этом очень особенном случае, когда вы действительно хотите работать с именами переменных по очень определенной причине, это может быть удобно.

0

если вы должны индексировать массив и имеют числовые ключи в массиве вы можете сделать это просто

$myarray = array_values($myarray); 
// example 
$afc_east[1] = "Buffalo Bills"; 
$afc_east[2] = "Miami Dolphins"; 
$afc_east[3] = "New England Patriots"; 
$afc_east[4] = "New York Jets"; 
$afc_east = array_values($afc_east); 
echo '<pre>'; 
print_r($afc_east); 

Выход:

Array 
(
[0] => Buffalo Bills 
[1] => Miami Dolphins 
[2] => New England Patriots 
[3] => New York Jets 
) 
+0

Это не помогает мне получить имя массивов – Lance

+0

@Lance создавать ассоциативный массив следующим образом: - $ afc = array ('afc_east' => $ afc_east, 'afc_west' => $ afc_west); –

0

Ну вот сценарий, быстрый и грязный

<?php 

$afc_east[1] = "Buffalo Bills"; 
$afc_east[2] = "Miami Dolphins"; 
$afc_east[3] = "New England Patriots"; 
$afc_east[4] = "New York Jets"; 

$afc_west[1] = "Denver Broncos"; 
$afc_west[2] = "Kansas City Chiefs"; 
$afc_west[3] = "Oakland Raiders"; 
$afc_west[4] = "San Diego Chargers"; 

$afc = array($afc_east,$afc_west); 
$count = 0; 
foreach($afc as $arr){ 
     $total = count($arr); 
     for($i=0;$i<=$total-1;$i++){ 
      $afc[$count][$i] = array_shift($arr);   
     } 
     array_unshift($afc[$count],$afc[$count][0]); 
     array_pop($afc[$count]); 
     array_pop($afc[$count]); 
     $count++; 
} 
//Output code to check if everything went correctly 
foreach($afc as $arr){ 
    foreach($arr as $key=>$value){ 
      echo $key."->".$value."<br/>"; 
    } 
} 

?> 
+0

И как получить имя массива? ex: "afc_east", "afc_west" – Lance

+0

Это то, что вам нужно было бы сделать вручную. Это единственный шаг на самом деле. То есть, создавая массив массивов. – Tanmay

Смежные вопросы