#php #arrays #constants #key
#php #массивы #константы #Клавиша
Вопрос:
У меня есть, надеюсь, быстрый вопрос. Я поместил массив в константу, но когда я добавляю ключи массива, он выходит из строя. Мой код ниже.
<?php define("my_const_arr", serialize(array("page_ids" => array("1234", "4123")))); ?>
<?php $page_id = "4123"; ?>
<?php if(in_array($page_id, unserialize(my_const_arr["page_ids"]))): ?>
<h1>Hello Stackoverflow</h1>
<?php endif; ?>
Комментарии:
1. Вам не следует использовать подобные константы. Если вы хотите сохранить массив, используйте переменную.
Ответ №1:
Вы не можете сделать my_const_arr["page_ids"]
в этот момент, потому что это все еще строка. Сначала вы должны отменить его сериализацию, а затем получить к нему доступ
$arr = unserialize(my_const_arr);
if(in_array($page_id, $arr["page_ids"])):
Комментарии:
1. Спасибо JohnP! Еще один вопрос, если у вас есть свободное время? Есть ли какие-либо недостатки в этом (т. Е. Насколько обременительны эти методы на самом деле)? Хез, похоже, думает, что я неправильно использую сериализацию / несериализацию …. или PHP, если уж на то пошло.
2. Это зависит. Если только эти массивы не являются гигантскими, переключение их на что-либо другое из-за производительности является преждевременной микрооптимизацией. Однако использование статического класса немного чище и инкапсулирует ваш массив.
3. Так будет ли справедливо сказать, что процесс Хайко Бублица намного лучше подходит для большинства приложений / сценариев?
4. @Smccullough нет, этот метод не работает. По сути, вы пишете класс и прячете в нем свой массив. Вы могли бы использовать метод get only, чтобы получить доступ к переменным в нем. Их не нужно объявлять как постоянные, поскольку у класса нет общедоступного установщика. Или просто используйте переменную 🙂
Ответ №2:
Вы используете как unserialize, так и PHP слегка неправильно:
<?php
define("my_const_arr", serialize(array("page_ids" => array("1234", "4123"))));
$page_id = "4123";
$a=unserialize(my_const_arr); // you need to usnerialize it before you can search for a specific key
if(in_array($page_id, $a["page_ids"])): ?>
<h1>Hello Stackoverflow</h1>
<?php endif; ?>
Я также хотел бы отметить, что константы не особенно полезны в приложении, которым вы можете управлять. Особенно, если этот код очень важен для вашего приложения.
<?php
$_myConstArr=array("page_ids" => array("1234", "4123"));
$page_id = "4123";
if(in_array($page_id, $_myConstArr["page_ids"])): ?>
<h1>Hello Stackoverflow</h1>
<?php endif; ?>
Делая это, вы не получите больших накладных расходов. Я бы подумал, что вызов serialize / unserialize часто приводит к нежелательной обработке.
Опубликуйте свой точный сценарий, и, возможно, будет доступно лучшее решение.
Ответ №3:
<?php $arr = unserialize(my_const_arr) ?>
<?php if(in_array($page_id, $arr["page_ids"])): ?>
Измените это таким образом
Ответ №4:
‘my_const_arr’ — это константа, а не массив.
Итак, my_const_arr["page_ids"]
неверно.
Может быть, вы можете попробовать это:
$my_const_arr = unserialize(my_const_arr);
echo if(in_array($page_id,$my_const_arr)) 'HELLO STACKOVERFLOW' : '';
Ответ №5:
Если нет реальной необходимости в преобразовании строк, почему бы не использовать простой класс в качестве контейнера для постоянных значений, например: EDIT: Sorry, просто чтобы оставить рабочий подход:
Class MyConstants {
public static $PAGE_IDS = array(1234, 4123);
}
Снаружи вы можете получить к нему доступ следующим образом
if (in_array( 4123, MyConstants::$PAGE_IDS )) {
echo "got you! <br/>n";
}
Комментарии:
1. Спасибо за ваш вклад, Хейко 🙂 Я пока оставлю этот вопрос на заднем плане.
2. Ха-ха, нет. Это не работает. Константы не могут содержать массивы, даже если они заключены в классы.
3. -1 На самом деле вы не можете объявлять массивы как константы подобным образом. Пожалуйста, обновите