Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > обвернуть массив


Автор: neoks 26.5.2012, 21:41
Интересует такой вот вопрос, к примеру я делаю так
Код

foreach($n['attr'] as $j=>$v) $se[] = $j.'="'.$v.'"';
        return '<div '.implode(' ',$se).'>'.$i.'</div>';

Приходится перебрать массив чтоб обвернуть каждое значение в ="..." затем впихать в массив и использовать implode()
Так вот интересует есть ли короткий вариант без перебора массива чтоб обвернуть каждое значение в массиве ) к примеру

Код

['test','test2']


В результат

Код

['="test"','="test2"']


Автор: Evghenusi 26.5.2012, 23:32
Цитата(neoks @  26.5.2012,  21:41 Найти цитируемый пост)
есть ли короткий вариант

Код

//1) без дополнительного массива
foreach($arr as $k=>$v) $arr[$k] = '="'. $arr[$k] .'"';
return '<div '.implode(' ',$se).'>'.$i.'</div>';

//2) без дополнительного массива и ф-ии implode
$str = '';
foreach($arr as $k=>$v) $str .= $k .'="'. $arr[$k] .'"';
return '<div '.$str.'>'.$i.'</div>';

Цитата(neoks @  26.5.2012,  21:41 Найти цитируемый пост)
без перебора массива
пока что хз(

Добавлено через 2 минуты и 18 секунд
хотя конечно не такие уж и короткие варианты, если погоня за байтом

Автор: neoks 26.5.2012, 23:57
Ясно, значит не судьба  smile 

Автор: Evghenusi 27.5.2012, 00:01
ещё такой вариант
Код
function test(&$v, $k){ $v = $k.'="'.$v.'"'; }
array_walk($arr, 'test');
return '<div '.implode(' ',$arr).'>'.$i.'</div>';
, но по мне так страшнее предыдущих

Автор: Fortop 27.5.2012, 14:19
Да бросьте вы

Код

'<div ="' . implode('" ="', $n['attr']) . '">'


Пардон, еще ключи надо
Тогда лучше обойти массив 2м вариантом

Но если вас не беспокоят некоторые проблемы, тогда можно вот так

Писать полностью все регуляркой мне было лень smile
Код

echo preg_replace(array('~\[([^\]]+)\]\s=>\s(.*)~', '~\r~', '~\n~', '~\s{2,}~'), array('\\1="\\2" ', '','',' '), trim(substr(print_r($a, true), 6), ' '. PHP_EOL . '()'));

Автор: Evghenusi 27.5.2012, 14:43
Цитата(Fortop @  27.5.2012,  14:19 Найти цитируемый пост)
Да бросьте вы
и ведь действительно,  smile
хотя при таком выводе ключей не будет

в предложенном варианте от ТС результат работы "скрипта"
Код
<div 0="test" 1="test2"></div>

, но так же есть и пример требуемого результата -

Цитата(neoks @  26.5.2012,  21:41 Найти цитируемый пост)
['="test"','="test2"']

хз короче!)

Автор: neoks 27.5.2012, 17:34
Цитата(Fortop @  27.5.2012,  14:19 Найти цитируемый пост)
Да бросьте вы

Действительно, что поделаешь ), значит так и будет ))
Просто было интересно есть ли короткий вариант, ну думаю и перебором тоже сойдет  smile 

Автор: baldina 28.5.2012, 12:17
может он не самый короткий, но вполне понятный и без циклов
Код

$a = array ('foo'=>'Foo', 'bar'=>'Bar');

function kv ($a, $b) {
  return $a . '=' . $b;
}

echo implode (',', array_map ('kv', array_keys($a), array_values($a)));


к сожалению array_map и array_reduce передают в параметрах только значения.
можно написать свою версию array_reduce, она может и в других случаях пригодиться

Код

function array_reduce_with_keys ($array, $callback, $initial=null) {
    $acc = $initial;
    foreach($array as $k=>$v)
        $acc = $callback($acc, $k, $v);
    return $acc;
}


$a = array ('foo'=>'Foo', 'bar'=>'Bar');

function kv ($str, $a, $b) {
  if ($str != '')
    $str .= ',';
  return $str . $a . '=' . $b;
}

echo array_reduce_with_keys ($a, 'kv', '');

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)