2017-05-14 143 views
0

多维我有一个数组,我想对它进行排序:排序阵列由第一子阵列

$ArrayStock = array(array("SIZE","L","XL","M"),("STOCK","12","3","2")); 

我怎样才能通过“大小”数组排序?

或者,我可以用这个数组为出发点:

$ArrayStock = array(array("L","XL","M"),("12","3","2")); 
+0

你不能,因为对某些stupi d原因“大小”是你的数组的一部分,而不是一个键 –

+0

好吧,如果我删除“大小”和“股票”如何排序?所以像这样$ ArrayStock = array(array(“L”,“XL”,“M”),(“12”,“3”,“2”)); –

+0

使联想 – Thielicious

回答

0

将有几种方法来剥皮这只猫。我所有的方法会产生预期的输出...

首先,让我们做没有重组的阵列(Demo):

$order=["XS","S","M","L","XL","2XL","3XL"]; // declare appropriate size order 
$ArrayStock=[["L","XL","M"],["12","3","2"]]; 

// Order the first subarray: 
uasort($ArrayStock[0],function($a,$b)use($order){ 
    return (array_search($a,$order)>array_search($b,$order)?1:-1); // any unidentifed sizes will go to the front 
}); 

// Sync the second subarray with first subarray: 
$ArrayStock[1]=array_replace($ArrayStock[0],$ArrayStock[1]); 

// Optionally re-index the keys: 
$ArrayStock[0]=array_values($ArrayStock[0]); 
$ArrayStock[1]=array_values($ArrayStock[1]); 


接下来,我将展示的几种方法你可以操纵一个重组数组。 trincot编写他的方式绝对没有错。这些只是我已经提出的替代方案...

我同意trincot关于使用尺寸作为关键字(因为它们将是唯一的)和股票作为价值计数。因此,第一个过程是生成新的数组结构:

$ArrayStock=[["L","XL","M"],["12","3","2"]]; 

#1一衬垫array_combine()的方法:

$new_structure=array_combine($ArrayStock[0],$ArrayStock[1]); 
// $new_structure = ['L'=>'12','XL'=>'3','M'=>'2'] 

#2foreach()方法:

foreach($ArrayStock[0] as $i=>$size){ 
    $new_structure[$size]=$ArrayStock[1][$i]; 
} 
// $new_structure = ['L'=>'12','XL'=>'3','M'=>'2'] 

现在到了新的数组排序,你可以使用uksort()或者一系列其他阵列功能与预定的顺序排列/循环:

$order=["XS","S","M","L","XL","2XL","3XL"]; // declare whatever appropriate sizes in order 

#1uksort()array_search()方法:

uksort($new_structure,function($a,$b)use($order){ 
    return (array_search($a,$order)>array_search($b,$order)?1:-1); 
    // any unidentified sizes will go to the front of the array 
}); 
// keep in mind, this doesn't declare $result, it sorts $new_structure 

#2array_replace()array_flip() - array_intersect() - array_keys()方法:

$result=array_replace(      // replace values on matching keys 
      array_flip(      // swap keys with values 
       array_intersect(
        $order,     // keep values from here 
        array_keys($new_structure) // that exist here 
       ) 
      ), 
     $new_structure);      // use these elements for replace 
// $result=['M'=>'2','L'=>'12','XL'=>'3']; 

#3foreach()array_intersect() - array_keys()方法:

// generate & iterate ordered array 
foreach(array_intersect($order,array_keys($new_structure)) as $v){ 
    $result[$v]=$new_structure[$v];  // build properly sorted array 
} 
// $result=['M'=>'2','L'=>'12','XL'=>'3']; 

最后的trincot已经表明,你可以恢复排序的数据恢复到初始格式多一个单衬里:

$ArrayStock=[array_keys($result),array_values($result)]; 
+0

@亨吉斯坦对不起,这个冗长的回答。大多数情况下,只需使用我开始的两步法即可,也可以重构数组并使用许多技术中的任何一种对数据进行排序。我主要想用你的问题来教育读者。让我知道是否有什么不适合你,或者如果你不明白我写的东西。 – mickmackusa

+0

我非常感谢complate教程$ ArrayStock @mickmackusa,我尝试和它为我工作。 –

+0

@亨吉斯特我的荣幸是我的。我总是通过实验/教学来学习更多。 – mickmackusa

1

你可以做这样的:

// Combine into one associative array 
$combined = array_combine($ArrayStock[0], $ArrayStock[1]); 

// Rebuild it in the correct order: 
foreach(["SIZE", "S","M","L","XL","XXL"] as $size) { 
    if (isset($combined[$size])) $result[$size] = $combined[$size]; 
} 

// Split associative array back to its original structure: 
$ArrayStock = [array_keys($result), array_values($result)]; 

注意,这种结构是不是在它的使用如此的实用。实际上我会坚持使用关联数组。