Мне нравится передавать ссылкой, если ПУСТОЙ УКАЗАТЕЛЬ не имеет значения, но я вижу аргументы в пользу обоих. Если Вы осторожны относительно кодирования, Вы могли бы, вероятно, устранить случайное возражение передачи ссылкой путем проверки, что Вы всегда передаете свои переменные ссылкой константы, например:
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 ) { ... }
Решение проблемы указателя более проблематично, хотя... нет никакого времени компиляции способа гарантировать, что указатель допустим, таким образом, Вы заканчиваете или с проблемами времени выполнения для проблем указателя, или с проверками времени выполнения или обоими. Это природа указателей.
Так или иначе, это - просто мое мнение, если это имеет значение.
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];
}
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
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;
}
}
}
Предполагая, что ключи в подмассивах уникальны, вы можете
Пример такого типа:
$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
)
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');
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.