Ключи массива PHP в константе

#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 На самом деле вы не можете объявлять массивы как константы подобным образом. Пожалуйста, обновите