Многомерный массив PHP Implode - PullRequest
19 голосов
/ 09 марта 2011

С точки зрения моей структуры данных, у меня есть массив сообщений, каждый из которых communications_id содержит три элемента информации: идентификатор, счет и контент.список идентификаторов через запятую, как мне это сделать?

Ответы [ 5 ]

55 голосов
/ 09 марта 2011

Обновление для PHP 5.5

В PHP 5.5 вводится array_column, что представляет собой удобный ярлык для целого класса использования array_map;это также применимо здесь.

$ids = array_column($communications, 'id');
$output = implode(',', $ids);

Оригинальный ответ

Вам необходимо создать массив просто идентификаторов из вашего массива сообщений.Тогда взрыв будет тривиальным.

Подсказка: функция для этого есть array_map.

Решение:

Предполагается PHP 5.3, в противном случае вам придется записать обратный вызов в виде строки.

$ids = array_map(function($item) { return $item['id']; }, $communications);
$output = implode(',', $ids);
4 голосов
/ 28 августа 2014

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

$array = 
  array(
    "1"    => "PHP code tester Sandbox Online",  
    "foo"  => "bar", 
     5 , 
     5     => 89009, 
    "case" => "Random Stuff", 
    "test" => 
       array(
         "test"  => "test221",
         "test2" => "testitem"
       ),
    "PHP Version" => phpversion()
  );

$string="";

$callback = 
  function ($value, $key) use (&$string) {
     $string .= $key . " = " . $value . "\n";
  };

array_walk_recursive($array, $callback);

echo $string;
## 1 = PHP code tester Sandbox Online
## foo = bar
## 2 = 5
## 5 = 89009
## case = Random Stuff
## test = test221
## test2 = testitem
## PHP Version = 7.1.3
3 голосов
/ 09 марта 2011

С http://snipplr.com/view.php?codeview&id=10187:

class Format {
    static public function arr_to_csv_line($arr) {
        $line = array();
        foreach ($arr as $v) {
            $line[] = is_array($v) ? self::arr_to_csv_line($v) : '"' . str_replace('"', '""', $v) . '"';
        }
        return implode(",", $line);
    }

    static public function arr_to_csv($arr) {
        $lines = array();
        foreach ($arr as $v) {
            $lines[] = self::arr_to_csv_line($v);
        }
        return implode("\n", $lines);
    }

}
0 голосов
/ 06 декабря 2015

этот комментарий основан на решении @jon, просто добавьте блок функционального кода

, но я должен использовать цикл, потому что array_map не принимает второй параметр

function array_column_implode($data_array = array(),$key = 'id', $delimiter = ',')
{
  if (function_exists('array_column'))
  {
    return implode($delimiter, array_column($data_array, $key));
  }
  else
  {
    $new_data_array = array();
    foreach ($data_array as $value) {
      if (isset($value[$key]))
      {
        $new_data_array[] = $value[$key];
      }
    }
    return implode($delimiter, $new_data_array);
  }
}
0 голосов
/ 03 июня 2014

Для всех, кто ищет ответ, вот что я смог сделать:

$singleDimensionalArray = array();

foreach($array["1"]["2"]["3"][...] as $value) {
    $singleDimensionalArray[] = $value;
}

Я использовал это с 3-мерным массивом.

...