【问题标题】:Multidimensional Array PHP Implode多维数组 PHP 内爆
【发布时间】:2024-01-18 08:14:01
【问题描述】:

就我的数据结构而言,我有一个通信数组,每个communications_id 本身包含三个信息:id、score 和 content。

我想内爆这个数组以获得逗号分隔的 id 列表,我该怎么做?

【问题讨论】:

标签: php multidimensional-array implode


【解决方案1】:

你可以看看array_walk_recursive函数。这是创建递归数组到字符串转换的工作 sn-p:

$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

【讨论】:

    【解决方案2】:

    此评论基于@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);
      }
    }
    

    【讨论】:

      【解决方案3】:

      对于其他正在寻找答案的人,这是我能够做到的:

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

      我将它与 3 维数组一起使用。

      【讨论】:

        【解决方案4】:

        PHP 5.5 更新

        PHP 5.5 引入了array_column,它是整个类array_map 用法的便捷快捷方式;这里也适用。

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

        原答案

        您需要从您的通信数组中创建一个仅包含 id 的数组。那么内爆将是微不足道的。

        提示:函数是array_map

        解决方案:

        假设 PHP 5.3,否则您必须将回调编写为字符串。

        $ids = array_map(function($item) { return $item['id']; }, $communications);
        $output = implode(',', $ids);
        

        【讨论】:

        • 我很好奇 $item 代表什么?
        • @Spencer:它代表$communications 中的“每个”项目,因为它被传递给回调函数以映射到其他内容。它只是一个形式参数的名称;您也可以使用任何其他名称。
        • 非常感谢!我有最后一个问题。如果只想获取前 60 个 id,你建议我怎么做?
        • @Spencer:$firstN = array_slice($allOfThem, 0, $n);。 PHP 数组函数非常有用且用途广泛。花一些时间熟悉它们:php.net/manual/en/ref.array.php.
        【解决方案5】:

        来自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);
            }
        
        }
        

        【讨论】: