Получение значений от ассоциативного массива

Мне нравится передавать ссылкой, если ПУСТОЙ УКАЗАТЕЛЬ не имеет значения, но я вижу аргументы в пользу обоих. Если Вы осторожны относительно кодирования, Вы могли бы, вероятно, устранить случайное возражение передачи ссылкой путем проверки, что Вы всегда передаете свои переменные ссылкой константы, например:

myfunc( const_cast< const int& >( a ) );

// Alternatively, this approach may require additional handling 
// in the function, but it's cleaner at call point
myfunc( boost::cref( a ) );

Это - много дополнительного кода для небольшого преимущества, все же. Как Kenny указал, C# обратился к этому от противоположного конца (требующий определенной передачи ссылкой), но это не опция для C++ (если, например, Вы не записали свои функции для взятия ссылочной обертки в качестве их параметра, как повышение:: касательно (параметрического усилителя)), например:

void myfunc( const boost::reference_wrapper< int >& a ) { ... }

Решение проблемы указателя более проблематично, хотя... нет никакого времени компиляции способа гарантировать, что указатель допустим, таким образом, Вы заканчиваете или с проблемами времени выполнения для проблем указателя, или с проверками времени выполнения или обоими. Это природа указателей.

Так или иначе, это - просто мое мнение, если это имеет значение.

19
задан hakre 25 December 2012 в 02:16
поделиться

6 ответов

I'd first transform $m to a simpler array with only one level:

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

Then you can use:

foreach ($options as $o) {
    echo $new_m[$o];
}
23
ответ дан 30 November 2019 в 04:25
поделиться

Try this:

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

Although It would be better TO have the array filled with the only the pages and not a multidimensional array

2
ответ дан 30 November 2019 в 04:25
поделиться

How's this?

foreach( $options as $option )
{
  foreach( $m as $m_key => $m_value )
  {
    if( $option == $m_key )
    {
      echo 'Name for ' . $options . ' is ' . $m_value;
      break;
    }
  }
}
0
ответ дан 30 November 2019 в 04:25
поделиться

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

  1. объединить все подмассивы в один массив с использованием call_user_func_array на array_merge
  2. поменять местами ключи и значения вашего параметра array
  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
)
1
ответ дан 30 November 2019 в 04:25
поделиться

Try using a recursive array_walk function, for example

$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
ответ дан 30 November 2019 в 04:25
поделиться

Are you sure that the options array is in the same order of $m? Maybe you your

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

is resolving into a $m[0]['gallery'] which is obviously empty.

you can try different solutions, to me, a nice one (maybe not so efficient) should be like this:

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

If you would like to use your approach have to flatten your array with something like this:

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

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

Doing this, though, eliminates duplicate voices of your original array if there are such duplicates.

0
ответ дан 30 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: