Получение значений из ассоциативного массива - PullRequest
18 голосов
/ 08 октября 2009

У меня есть следующий основной массив с именем $m

Array
(
    [0] => Array
        (
            [home] => Home
        )

    [1] => Array
        (
            [contact_us] => Contact Us
        )

    [2] => Array
        (
            [about_us] => About Us
        )

    [3] => Array
        (
            [feedback_form] => Feedback Form
        )

    [4] => Array
        (
            [enquiry_form] => Products
        )

    [5] => Array
        (
            [gallery] => Gallery
        )

)

У меня есть значения, например, home, contact_us в массиве, хранящемся $ options, мне нужно получить значения из основного массива с именем $ m, используя массив $ options

например. Если массив $ options имеет значение home, мне нужно получить значение Home из основного массива ($ m)

мой код выглядит следующим образом

                    $c = 0;
                    foreach($options as $o){
                        echo $m[$c][$o];
                        ++$c;
                    }

Я как-то просто не могу получить значения из основного массива?

Ответы [ 7 ]

23 голосов
/ 08 октября 2009

Сначала я бы преобразовал $m в более простой массив с одним уровнем:

$new_m = array();
foreach ($m as $item) {
    foreach ($item as $key => $value) {
        $new_m[$key] = $value;
    } 
}

Тогда вы можете использовать:

foreach ($options as $o) {
    echo $new_m[$o];
}
2 голосов
/ 08 октября 2009

Попробуйте это:

foreach($options as $o){
    foreach($m as $check){
        if(isset($check[$o])) echo $check[$o];
    }
}

Хотя было бы лучше, чтобы массив был заполнен только страницами, а не многомерным массивом

1 голос
/ 08 октября 2009

Предполагая, что ключи в подмассивах уникальны, вы можете

  1. объединить все вложенные массивы в один массив, используя call_user_func_array для array_merge
  2. Обмен ключами и значениями вашего массива опций
  3. Используйте array_intersect_key для получения массива со всеми значениями.

Пример примерно так:

$options = array('about_us', 'enquiry_form');

$values = array_intersect_key(
           call_user_func_array('array_merge', $m), // Merge all subarrays 
           array_flip($options)                     // Make values in options keys
          );  

print_r($values);

, что приводит к:

Array
(
    [about_us] => About Us
    [enquiry_form] => Products
)
0 голосов
/ 16 марта 2015
$trails1 = array();
          foreach ($trails as $item) {
              foreach ($item as $key => $value) {
                  $trails1[].= $value;
              }

          }
          echo '<pre>';print_r($trails1);
        exit;
0 голосов
/ 08 октября 2009

Попробуйте использовать рекурсивную функцию array_walk, например

$a = array(
        array('ooo'=>'yeah'),
        array('bbb'=>'man')
    );


function get_array_values($item, $key){
    if(!is_numeric($key)){
        echo "$item\n";
    }
}

array_walk_recursive($a,'get_array_values');
0 голосов
/ 08 октября 2009

Вы уверены, что массив параметров имеет тот же порядок $ m? Может быть, вы ваш

echo $m[$c][$o];

преобразуется в $ m [0] ['gallery'], которая, очевидно, пуста.

Вы можете попробовать разные решения, для меня, хорошее (может быть, не очень эффективное) должно быть так:

for($c=0, $limit=count($c); $c < $limit; $c++)
  if (array_search(key($m[$c]), $options)) 
    echo current($m[$c]);

Если вы хотите использовать свой подход, выровняйте массив следующим образом:

foreach ($m as $o)
  $flattenedArray[key($o)]=current($o);

foreach ($options as $o)
  echo $flattenedArray($o);

Тем не менее, при этом удаляются дубликаты голосов исходного массива, если такие дубликаты есть.

0 голосов
/ 08 октября 2009

Как это?

foreach( $options as $option )
{
  foreach( $m as $m_key => $m_value )
  {
    if( $option == $m_key )
    {
      echo 'Name for ' . $options . ' is ' . $m_value;
      break;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...