2012-07-26 199 views
0

我忙于排序我的应用程序中的菜单结构。一旦菜单被用户重新排序,值(例如:菜单项1,菜单项2等)仍然在相同的地方。结合两个数组PHP

现在我有两个数组,一个保存它们的排序方式(数组1),另一个保存菜单项的值。 (阵列2)

两个阵列的例子; (阵列1中,保持键)

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 0 
) 

上述阵列的值是新的数组的键。

(阵列2,保持该值)

Array 
(
    [0] => value_0 
    [1] => value_1 
    [2] => value_2 
) 

因此,我认为这将是最好创建一个新的数组,其由选自;

  1. 的阵列1的值的数组2

的值。然而,我运行到的问题。我想让数组2中的值坚持他们的键。所以我们可以说我改变了value_0的位置到最后一个,新的数组看起来像这样;

Array 
(
    [1] => value_1 
    [2] => value_2 
    [0] => value_0 
) 

有没有办法做到这一点或我是否完全错误?

编辑

好了,所以期多维阵列它是。但是,我有问题创建一个。

Array 1和Array 2都来自数据库。具有排序顺序的数组1和数组2包含这些值。现在,数组2中的值就像这样存储;值1,值2,值3。所以为了能够与他们合作,我爆炸了(逗号)。

提取结果是不同的;

  • 对于第一个数组,它会返回多少个值。 (所以如果有3个值,它将返回3个不同的位置。)
  • 对于第二个数组,它将返回18条记录,因为这与其他菜单项(子菜单等)有关。

因此,对于第一个数组我做;

while ($row = mysql_fetch_assoc($result_query_test)) { 
     $positions[] = $row['position']; 
    } 

对于我做的第二个数组;

while ($row = mysql_fetch_assoc($result_values)) { 
     $array_values = explode(',', $row['values']); 
} 

从那时起,我在创建multidimensinonal数组时遇到了问题;

while ($row = mysql_fetch_assoc($result_values)) { 
    $array_values = explode(',', $row['values']); 
    foreach ($positions as $new_key) { 
     foreach ($array_values as $value) { 
       $new_array[] = array('key' => $new_key, 'value' => $value); 
     } 
    } 
} 

编辑二:

这是我现在用的;

(因为$ all_values是一个多维数组,因为我有事先的值发生爆炸。)

foreach ($all_values as $values) { 
     foreach ($values as $key => $value) { 
      $new_array[] = array('key' => $positions[$key], 'value' => $value); 
     } 
    } 

这就是$ new_array的回报;

Array 
(
    [0] => Array 
     (
      [key] => 0 
      [value] => value_0 
     ) 

    [1] => Array 
     (
      [key] => 2 
      [value] => value_2 
     ) 

    [2] => Array 
     (
      [key] => 1 
      [value] => value_1 
     ) 

    [3] => Array 
     (
      [key] => 0 
      [value] => value_0 
     ) 

    [4] => Array 
     (
      [key] => 2 
      [value] => value_2 
     ) 

    [5] => Array 
     (
      [key] => 1 
      [value] => value_1 
     ) 

现在我需要得到的值和implode他们用逗号。但是,由于不是每3个值(value_0,value_1,value_3)在一起,我现在不能这样做。

在这个例子中有3个按键,(0,1,2),这应该是它们的值不同的阵列,就像你在你的例子一样:

Array (
    [0] = Array (
    [key] = 1, 
    [value] = value_1 
), 
    [1] = Array (
    [key] = 2, 
    [value] = value_2 
), 
    [2] = Array (
    [key] = 0, 
    [value] = value_0 
) 
) 
+0

如果我理解正确这你想要一个嵌套的列表? – 2012-07-26 14:41:18

+0

考虑一个二维数组? http://webcheatsheet.com/php/multidimensional_arrays.php – Don 2012-07-26 14:42:42

+0

或者没有数组...:P通过使用[left]和[right] – 2012-07-26 14:43:31

回答

0

我认为你可以得到什么你想这样做:

$new = array(); 
for($i = 0, $len = count($array1), $i < $len, ++$i) { 
    $new[$array1[$i]] = $array2[$i]; 
} 

现在$new包含在订单中值,您希望他们

+0

你的方法没有给我正确的键和相应的值。 – Kvarbyte 2012-07-26 19:14:22

+0

是的,我看你是对的:考虑'$ array1 = array(1,2,0)'和'$ array2 = array('value_0','value_1','value_2')'这个脚本产生'$ new = array(1 =>'value_0',2 =>'value_1',0 =>'value_2')'...抱歉,错误的建议,我认为你最适合使用多维数组。 – 2012-07-27 06:50:19

3

何不做一个多维数组?

$arrayThree = 
Array (
    [0] = Array (
    [key] = 1, 
    [value] = value_1 
), 
    [1] = Array (
    [key] = 2, 
    [value] = value_2 
), 
    [2] = Array (
    [key] = 0, 
    [value] = value_0 
) 
) 

无论他们在什么顺序,关键和价值永远是集合。

foreach ($arrayThree as $tempArray) 
{ 
echo $tempArray['key']; 
echo $tempArray['value']; 
} 

创建阵列

$arrayOne = array(); 
$arrayTwo = array(); 
$arrayThree = array(); 

$query = 'SELECT key FROM table1 '; 
$result = mysql_query($query) or die(mysql_error()); 

while($data = mysql_fetch_assoc($result)) 
{ 
    $arrayOne[] = $data['key']; 
} 

$query = 'SELECT value FROM table2 '; 
$result = mysql_query($query) or die(mysql_error()); 

while($data = mysql_fetch_assoc($result)) 
{ 
    $arrayTwo[] = $data['value']; 
} 

foreach($arrayOne as $key => $value) 
{ 
    $arrayThree[] = array('key' => $value, 'value' => $arrayTwo[$key]); 
} 

您可以随时使用和mysqli或PDO的版本,如果你使用它们。

示例数据

//THESE MIMIC YOUR SELECT RESULTS 
$test_keys = array(1,2,3); 
$test_values = array('value_1', 'value_2', 'value_3'); 

    //DEFAULTS 
$arrayOne = array(); 
$arrayTwo = array(); 
$arrayThree = array(); 

    //WHILE FIRST SELECT 
for($i=0;$i<count($test_keys);$i++) 
{ 
    $arrayOne[] = $test_keys[$i]; 
} 

    //WHILE SECOND SELECT 
for($i=0;$i<count($test_values);$i++) 
{ 
    $arrayTwo[] = $test_values[$i]; 
} 

    //MAKE THE FINAL ARRAY 
foreach($arrayOne as $key => $value) 
{ 
    $arrayThree[] = array('key' => $value, 'value' => $arrayTwo[$key]); 
} 

    //CHECK THE OUTPUT FOR THE NEW ARRAY 
echo '<pre>'.print_r($arrayThree,true).'</pre>'; 

示例输出

Array 
(
    [0] => Array 
     (
      [key] => 1 
      [value] => value_1 
     ) 

    [1] => Array 
     (
      [key] => 2 
      [value] => value_2 
     ) 

    [2] => Array 
     (
      [key] => 3 
      [value] => value_3 
     ) 

) 

内爆列表

$implodeValues = array_map(function($item) { return $item['value']; }, $arrayThree); 
$implodeVariable = implode(',', $implodeValues); 

echo $implodeVariable; 

破灭输出

value_1,value_2,value_3

+0

谢谢你的例子。我有创建多维数组时遇到问题。这两个数组(数组1和数组2)都来自数据库。具有排序顺序的数组1可以正常工作,但Array 2是来自爆炸函数的数组。 (这是因为这些值在数据库中是这样存储的; value1,value2,value3等) 我将编辑我的帖子以显示发生了什么。 – Kvarbyte 2012-07-26 16:44:16

+0

我在答案的底部添加了一个简单的选择部分。如果你从多个表中获得它们,请告诉我。 – Biotox 2012-07-26 18:09:59

+0

我正在使用多个表。这些值是这样存储的(在数据库中);值1,值2,值3,等等。所以我需要将它们爆炸,(逗号)。 现在我知道的一件事是值的数量,所以如果我留在我的例子中,value1,value2,value3是3.哪一个总是与排序顺序相同。如果那有意义的话。这基本上是我坚持。 – Kvarbyte 2012-07-26 18:20:32