PHP: подстановочные знаки на многомерном ключе

0

У меня многомерный массив $array["A"]["B"]["C"]["D"]. Список длиннее. Есть ли подстановочный знак, который я могу использовать для получения значения ["D"] в let say ["B"] массив? Что-то вроде этого, $array["A"]["B"][*]["D"]? или $array[*]["B"][*]["D"]?

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

$array[2013][2][23]["ItemName"]["ItemPrice"] ..... 

Если бы это сработало, было бы действительно замечательно

$array[*][2][*][*]["ItemPrice"].. 

Есть идеи?

  • 3
    это невозможно. вам придется зацикливаться на каждом слое массива и искать свое значение.
  • 3
    Если вы попадаете в эту ситуацию, вам, как правило, нужно вернуться туда, где извлекаются данные (SQL), и получить то, что вы хотите более конкретно.
Показать ещё 2 комментария
Теги:
arrays
multidimensional-array

2 ответа

0

Благодаря @Sepehr-Farshid мне просто пришло в голову, что я могу использовать рекурсивную функцию (что-то, что я не использую для спокойствия. Вот пример.

$newarray = array();
$tempArray = $oldarray;

$levels[] = 1;
$keys[] = 2;
$levels[] = 4;
$keys[] = "ItemPrice";
$lastLevel =4;

recurArray($tempArray, 0);

function recurArray($array, $level)
{
   foreach($array as $key => $value) {
     if(array_search($level, $GLOBALS["levels"]) {
       $tempKey = array_search($level, $GLOBALS["levels"];
       if($key == $GLOBALS["keys"][$tempKey] {
         if($level == $GLOBALS["lastLevel"]) $GLOBALS["newarray"] = $value;
         else recurArray($value, $level + 1);
       }
       else { return; }          
     }
     else { recurArray($value, $level + 1); }
   }  
}

это может быть не оптимальный способ, но он будет работать и может быть уточнен. : D

0

Вы можете сделать несколько foreach для цикла, хотя каждый вложенный массив, который вы хотите зацикливать.

foreach ($array as $a) {
    foreach ($a["B"] as $c) {
        foreach ($c as $d) {
           // Do something with $d
        }
    }
}

Это будет $array[*]["B"][*][*]

Edit: Вы могли бы объединить мое предложение с в while цикл.

$innerArray = $array;
while (true) {
    foreach ($array as $key => $value) {
        if ($key == "D") {
            // Do something with this value
        } else if (is_array($value)) { 
            $innerArray = $value; 
        } else {
            break;
        }
    }
}
  • 0
    измерение массива длинное, и некоторые данные должны ссылаться на b, некоторые - на c. и длина измерения, как известно, не создает foreach.
  • 0
    Понятно, посмотрите на мои правки.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню