多维数组,移动到一个简单的数组

时间:2011-11-29 16:35:59

标签: php arrays multidimensional-array

我有一个看起来像这样的数组,

[0] => Array
    (
        [youtube_showreel_url_1] => youtube1.com
        [youtube_showreel_description] => youtube1.com - desc
    )

[1] => Array
    (
        [youtube_showreel_url_2] => youtube2.com
        [youtube_showreel_description] => youtub2.com - desc
    )

[2] => Array
    (
        [youtube_showreel_url_3] => youtube3.com
        [youtube_showreel_description] => youtube3.com - desc
    )

[3] => Array
    (
        [youtube_showreel_url_4] => youtube4.com
        [youtube_showreel_description] => youtube4.com - desc
    )

[4] => Array
    (
        [youtube_showreel_url_5] => youtube5.com
        [youtube_showreel_description] => youtube5.com - desc
    )

是否有可能将PHP变成看起来像这样的东西?

[0] => Array ( 
        [youtube_showreel_url_1] => youtube1.com  
        [youtube_showreel_description] => youtube1.com - desc 
        [youtube_showreel_url_2] => youtube2.com
        [youtube_showreel_description] => youtub2.com - desc
        [youtube_showreel_url_3] => youtube3.com
        [youtube_showreel_description] => youtube3.com - desc
        [youtube_showreel_url_4] => youtube4.com
        [youtube_showreel_description] => youtube4.com - desc
        [youtube_showreel_url_5] => youtube5.com
        [youtube_showreel_description] => youtube5.com - desc
    )

可以将它爆炸或通过循环或其他东西运行吗?

6 个答案:

答案 0 :(得分:1)

假设您的原始数据保存在名为$input的变量中:

// This will hold the result
$result = array();

foreach ($input as $index => $item) { // Loop outer array
  foreach ($item as $key => $val) { // Loop inner items
    $result[$key] = $val; // Create entry in $result
  }
}

// Show the result
print_r($result);

但是,您的输入具有多次出现的相同键,后面的值将覆盖第一个。所以你可能想做这样的事情:

foreach ($input as $index => $item) { // Loop outer array
  foreach ($item as $key => $val) { // Loop inner items
    $result[$key.$index] = $val; // Create entry in $result
  }
}

答案 1 :(得分:0)

<?php

$aNonFlat = array(
    1,
    2,
    array(
        3,
        4,
        5,
        array(
            6,
            7
        ),
        8,
        9,
    ),
    10,
    11
);

$objTmp = (object) array('aFlat' => array());

array_walk_recursive($aNonFlat, create_function('&$v, $k, &$t', '$t->aFlat[] = $v;'), $objTmp);

var_dump($objTmp->aFlat);

/*
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
  [10]=>
  int(11)
}
*/

?>

来源:http://ca.php.net/manual/fr/function.array-values.php#86784

答案 2 :(得分:0)

数组键必须具有唯一的名称,这意味着您将无法拥有多个youtube_showreel_description键,否则您只需覆盖该值。您可以将密钥重命名为youtube_showreel_description_NN,其中NN是描述的编号,类似于您的网址。

答案 3 :(得分:0)

&#34; youtube_showreel_description&#34;

您应该考虑更好的数据结构

我建议你保留它的多维数组结构

Array
(
    [0] => Array
        (
                [url] => youtube1.com
                [description] => youtube1.com - desc
        )
    [1] => Array
        (
                [url] => youtube2.com
                [description] => youtube2.com - desc
        )
    [2] => Array
        (
                [url] => youtube3.com
                [description] => youtube3.com - desc
        )
    [3] => Array
        (
                [url] => youtube1.com
                [description] => youtube3.com - desc
        )
    [4] => Array
        (
                [url] => youtube1.com
                [description] => youtube4.com - desc
        )
)

如果您喜欢这种方式,我认为它更干净,更容易解析

答案 4 :(得分:0)

不完全是,[youtube_showreel_description]会在每次声明后覆盖自己,您需要为每个键使用唯一标识符。如果键不重要,您可以使用foreach循环遍历现有数组并设置常规迭代键并“知道”数组进入集合,其中第一个元素是url,第二个元素是描述。

编辑:如果键不重要,您可以使用url作为键和描述作为值,这样可以更容易迭代,因为每个元素只与一个项目相关。

答案 5 :(得分:0)

正如大家已经提到的那样,你会在' youtube_showreel_description '上发生碰撞。这样的事情怎么样?:

// values (stays the same - no need to reformat)
$values = array(
  array(
    'youtube_showreel_url_1' => 'youtube1.com',
    'youtube_showreel_description' => 'youtube1.com desc'
  ),
  array(
    'youtube_showreel_url_2' => 'youtube2.com',
    'youtube_showreel_description' => 'youtube2.com desc'
  ),
  array(
    'youtube_showreel_url_3' => 'youtube3.com',
    'youtube_showreel_description' => 'youtube3.com desc'
  ),
  array(
    'youtube_showreel_url_4' => 'youtube4.com',
    'youtube_showreel_description' => 'youtube4.com desc'
  )
);

// the good stuff
$result = array_map(function($v) {
  return array(
    'url'         => array_shift($v),
    'description' => $v['youtube_showreel_description']
  );
}, $values);


// result
array(4) {
  [0]=>
  array(2) {
    ["url"] => string(12) "youtube1.com"
    ["description"] => string(17) "youtube1.com desc"
  }
  [1]=>
  array(2) {
    ["url"] => string(12) "youtube2.com"
    ["description"] => string(17) "youtube2.com desc"
  }
  [2]=>
  array(2) {
    ["url"] => string(12) "youtube3.com"
    ["description"] => string(17) "youtube3.com desc"
  }
  [3]=>
  array(2) {
    ["url"] => string(12) "youtube4.com"
    ["description"] => string(17) "youtube4.com desc"
  }
}