Определение Array для списка WHILE

Статус
В этой теме нельзя размещать новые ответы.

passshift

Новичок
Здравствуйте!

Подскажите, как определить Array в зависимости от содержания переменной списка?

Сейчас работает вот так:

PHP:
while($znachenie=$zapros->fetch(PDO::FETCH_ASSOC)) {

        if ($znachenie['fruct'] == 'ar') {
        $fruct='Арбуз';
        }
        else if ($znachenie['fruct'] == 'bn') {
        $fruct='Банан';
        }
        else if ($znachenie['fruct'] == 'sl') {
        $fruct='Слива';
        }

  echo $fruct.'<br />';
}
- работает, но я думаю можно вместо IF ELSE использовать Array, не подскажете как реализовать?
 

Priler

WEB Developer
Упросить алгоритм?
Ну в принципе:
PHP:
while($z=$zapros->fetch(PDO::FETCH_ASSOC)):

$fruct=($z=='ar') ? 'Арбуз':
       (($z=='bn') ? 'Банан':
       (($z=='sl') ? 'Слива':'unknown value'));

echo "$fruct<br />";

endwhile;
 

passshift

Новичок
Priler, спасибо, робит :)

По скорости выполнения предложенный вариант быстрее?
 

AmdY

Пью пиво
Команда форума
Priler
это ужасный вариант, особенно учитывая особенности приоритетов.
PHP:
$dictionary = [
    'ar' => 'Арбуз',
 ...
];
$fruit = $dictionary[ $znachenie['fruct'] ];
 

passshift

Новичок
AmdY, спасибо большое!

Правда у меня ошибку выдает:

Parse error: syntax error, unexpected '[' in ... on line 20

Строка 20:

$dictionary = [
 

Priler

WEB Developer
Priler
это ужасный вариант, особенно учитывая особенности приоритетов.
PHP:
$dictionary = [
    'ar' => 'Арбуз',
 ...
];
$fruit = $dictionary[ $znachenie['fruct'] ];
У вас еще более ужасный пример, представьте что вариантов 100, зачем записывать в массив ненужные элементы, что бы потом достать один из них.
Выглядит совсем не элегантно и может выдать ошибку, если попытаться вызвать элемент, которого нет в массиве, но в принципе если улучшить, то можно получить нормальный код.
 

Priler

WEB Developer
Priler, спасибо, робит :)

По скорости выполнения предложенный вариант быстрее?
Ну по скорости не знаю, но выглядит точно понятнее и элегантнее, а также проще.
Возможно быстрее :)
Можно еще сделать свичем, или альтернативной конструкцией if...else
 

Priler

WEB Developer
Priler
это ужасный вариант, особенно учитывая особенности приоритетов.
PHP:
$dictionary = [
    'ar' => 'Арбуз',
 ...
];
$fruit = $dictionary[ $znachenie['fruct'] ];
Добавим немного элегантности и профессионализма, и получим следующее:
PHP:
while($z=$zapros->fetch(PDO::FETCH_ASSOC)):
foreach($z as $key=>$val) {
$dic[$key]=$val;
}
endwhile;
$fruit=$dic[$z['fruct']];
 

AmdY

Пью пиво
Команда форума
У вас еще более ужасный пример, представьте что вариантов 100, зачем записывать в массив ненужные элементы, что бы потом достать один из них.
Ты прикидываешься? Представь свой вариант при тех же 100 элементах...
Выглядит совсем не элегантно и может выдать ошибку, если попытаться вызвать элемент, которого нет в массиве, но в принципе если улучшить, то можно получить нормальный код.
Мегаулучшение
$fruit = isset($dictionary[ $znachenie['fruct'] ]) ? $dictionary[ $znachenie['fruct'] ]: 'unknown fruit';
Это вещи о которых автор сам должен подумать, здесь просто описание использования СЛОВАРЕЙ, реализация может быть какой угодно.
 

hell0w0rd

Продвинутый новичок
Ну по скорости не знаю, но выглядит точно понятнее и элегантнее, а также проще.
Возможно быстрее :)
Можно еще сделать свичем, или альтернативной конструкцией if...else
Ты правда думаешь, что деревья работают медленнее чем последовательный перебор?
И если делать красиво и тестируемо - надо делать как-то так:
PHP:
<?php

abstract class Dictionary implements ArrayAccess
{
    private $content;

    abstract protected function getContent();

    public function __construct()
    {
        $this->content = $this->getContent();
    }

    public function offsetSet($offset, $value)
    {
        $this->content[$offset] = $value;
    }

    public function offsetExists($offset)
    {
        return array_key_exists($offset, $this->content);
    }

    public function offsetUnset($offset)
    {
        unset($this->content[$offset]);
    }

    public function offsetGet($offset)
    {
        if(!$this->offsetExists($offset)) {
            throw new InvalidArgumentException(sprintf('For %s can not define pair', $offset))
        }

        return $this->content[$offset];
    }
}

class FruitsDictionary extends Dictionary
{
    protected function getContent()
    {
        return parse_ini_file(__DIR__.'/fruits.ini');
    }
}

$dictionary = new FruitsDictionary;
while($znachenie = $zapros->fetch(PDO::FETCH_ASSOC)) {
    $fruct = $dictionary[$znachenie['fruct']];
}
 

Priler

WEB Developer
Ты правда думаешь, что деревья работают медленнее чем последовательный перебор?
И если делать красиво и тестируемо - надо делать как-то так:
PHP:
<?php

abstract class Dictionary implements ArrayAccess
{
    private $content;

    abstract protected function getContent();

    public function __construct()
    {
        $this->content = $this->getContent();
    }

    public function offsetSet($offset, $value)
    {
        $this->content[$offset] = $value;
    }

    public function offsetExists($offset)
    {
        return array_key_exists($offset, $this->content);
    }

    public function offsetUnset($offset)
    {
        unset($this->content[$offset]);
    }

    public function offsetGet($offset)
    {
        if(!$this->offsetExists($offset)) {
            throw new InvalidArgumentException(sprintf('For %s can not define pair', $offset))
        }

        return $this->content[$offset];
    }
}

class FruitsDictionary extends Dictionary
{
    protected function getContent()
    {
        return parse_ini_file(__DIR__.'/fruits.ini');
    }
}

$dictionary = new FruitsDictionary;
while($znachenie = $zapros->fetch(PDO::FETCH_ASSOC)) {
    $fruct = $dictionary[$znachenie['fruct']];
}
Я просто предложил вариант, или нельзя?
 

Priler

WEB Developer
Ты прикидываешься? Представь свой вариант при тех же 100 элементах...

Мегаулучшение
$fruit = isset($dictionary[ $znachenie['fruct'] ]) ? $dictionary[ $znachenie['fruct'] ]: 'unknown fruit';
Это вещи о которых автор сам должен подумать, здесь просто описание использования СЛОВАРЕЙ, реализация может быть какой угодно.
Вообще это надо смотреть на месте, откуда я знаю сколько их там будет, 100-200.
Если штук 10-15 то мой вариант лучше, если больше, то твой вариант, но модифицированный.
 

hell0w0rd

Продвинутый новичок
Вообще это надо смотреть на месте, откуда я знаю сколько их там будет, 100-200.
Если штук 10-15 то мой вариант лучше, если больше, то твой вариант, но модифицированный.
Посмотрите что такое деревья, дело не в том чей вариант.
В случае с if/elseif будет последовательный перебор. Все равно что создать массив (не ассоциативный) и перебирать его, а на совпадении поставить break
Если ассоциативный массив и доступ по ключу - будет поиск по дереву, что в разы быстрее перебора.
Приятным дополнением будет уменьшение кол-ва кода при использовании массива
 

Priler

WEB Developer
Посмотрите что такое деревья, дело не в том чей вариант.
В случае с if/elseif будет последовательный перебор. Все равно что создать массив (не ассоциативный) и перебирать его, а на совпадении поставить break
Если ассоциативный массив и доступ по ключу - будет поиск по дереву, что в разы быстрее перебора.
Приятным дополнением будет уменьшение кол-ва кода при использовании массива
Не знал, TNX за инфу
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху