массив php взрывается

У меня есть этот массив:

array (size=5)
  35 => string '3' (length=1)
  24 => string '6' (length=1)
  72 => string '1' (length=1)
  16 => string '5' (length=1)
  81 => string '2' (length=1)

Я хочу взорвать идентификатор, чтобы получить:

$str = '35-3|24-6|72-1|16-5|81-2';

Как получить его простым способом?

Спасибо.


person medk    schedule 11.11.2012    source источник
comment
Когда вы говорите How to get it the easy way?, вы имеете в виду без цикла, верно?   -  person Baba    schedule 11.11.2012


Ответы (4)


Я не проверял это, но это должно быть довольно прямолинейно...

foreach($array as $key=>$item){
    $new_arr[] = $key."-".$item;
}

$str = implode('|', $new_arr);
person Sylus    schedule 11.11.2012

Одна из возможностей была бы такой

function mapKeyVal($k, $v) {
    return $k . '-' . $v;
}

echo implode('|', array_map('mapKeyVal', 
                            array_keys($arry), 
                            array_values($arry)
                           )
      );
person Havelock    schedule 11.11.2012
comment
+1 Не забывайте, что вы можете реализовать анонимную функцию! php.net/manual/en/functions.anonymous.php - person HamZa; 11.11.2012
comment
да, я думал, что это сделает его немного более понятным :-) - person Havelock; 11.11.2012
comment
Аноним function($l, $r) { return "$l-$r"; }. - person gremo; 11.11.2012
comment
Спасибо @Gremo, как я уже сказал выше, учитывая вопрос, хотел сделать ответ не слишком сложным :-) - person Havelock; 11.11.2012
comment
@Havelock: это решение работает, и хотя обратный вызов может быть анонимной функцией, существует множество хостов, поддерживающих PHP старше 5.3 (поэтому без каких-либо анонимных функций). Смотрите мой ответ для более общей альтернативы. - person Tadeck; 11.11.2012

Вы не можете сделать это с помощью implode, см. ответ @havelock ниже, однако было бы проще использовать цикл или другую форму итерации.

$str = "";

foreach ($array as $key => $value) {

    $str .= $key . "-" . $value . "|";

}

$str = substr(0, strlen($str)-1);
person max_    schedule 11.11.2012
comment
Вы также можете использовать rtrim() для удаления последнего | - person GBD; 11.11.2012
comment
Я бы настаивал, чтобы вы могли сделать это и с implode() как часть решения... см. мой ответ :-) - person Havelock; 11.11.2012
comment
У него может быть прокрутка страницы, если он хочет увидеть другие варианты, мне не нужно перечислять их в своем ответе. - person max_; 11.11.2012

Решение

Вы можете сделать это чисто, присоединив строки, используя, например. пользовательская функция ассоциативного отображения, которая выглядит так:

function array_map_associative($callback, $array){
    $result = array();
    foreach ($array as $key => $value){
        $result[] = call_user_func($callback, $key, $value);
    }
    return $result;
}

Полный пример и тест

Полное решение с его использованием может выглядеть так:

<?php

function array_map_associative($callback, $array){
    $result = array();
    foreach ($array as $key => $value){
        $result[] = call_user_func($callback, $key, $value);
    }
    return $result;
}

function callback($key, $value){
    return $key . '-' . $value;
}

$data = array(
    35 => '3',
    24 => '6',
    72 => '1',
    16 => '5',
    81 => '2',
);

$result = implode('|', array_map_associative('callback', $data));

var_dump($result);

и результат:

string(24) "35-3|24-6|72-1|16-5|81-2"

что соответствует тому, что вы ожидали.

Доказательство здесь: http://ideone.com/HPsVO6.

person Tadeck    schedule 11.11.2012