使用PHP从现有多维数组的特定值创建新数组
简短的项目描述:我需要从现有数组中输出特定值,用于标签式字母导航。导航将几个字母组合成选项卡(即“A-C”),然后显示以这些字母开头的帖子的所有链接。导航是由插件创建的,所以我需要创建变量来输出组 我拥有的内容:我拥有一个数组,该数组按子数组的使用PHP从现有多维数组的特定值创建新数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,简短的项目描述:我需要从现有数组中输出特定值,用于标签式字母导航。导航将几个字母组合成选项卡(即“A-C”),然后显示以这些字母开头的帖子的所有链接。导航是由插件创建的,所以我需要创建变量来输出组 我拥有的内容:我拥有一个数组,该数组按子数组的名称键按字母顺序排序。它看起来像以下示例: Array ( [0] => Array ( ['name'] => 'Alpha' ['link'] => 'http://www.someurl.com' )
名称
键按字母顺序排序。它看起来像以下示例:
Array (
[0] => Array (
['name'] => 'Alpha'
['link'] => 'http://www.someurl.com'
)
[1] => Array (
['name'] => 'Alpha2'
['link'] => 'http://www.someotherurl.com'
)
[2] => Array (
['name'] => 'Beta'
['link'] => 'http://www.someurl.com'
)
[3] => Array (
['name'] => 'Delta'
['link'] => 'http://www.someotherurl.com'
)
[4] => Array (
['name'] => 'Zephyr'
['link'] => 'http://www.someurl.com'
)
)
我认为需要做的事情:我需要创建5个新数组,按字母顺序将这些子数组分组。也就是说,我需要将name
以'A'-'C'开头的所有数组放入一个数组,将'D'-'G'放入另一个数组,以此类推
换句话说,上面显示的数组将导致创建以下内容:
$a_c = array(
[0] => Array (
['name'] => 'Alpha'
['link'] => 'http://www.someurl.com'
)
[1] => Array (
['name'] => 'Alpha2'
['link'] => 'http://www.someotherurl.com'
)
[2] => Array (
['name'] => 'Beta'
['link'] => 'http://www.someurl.com'
)
);
$d_g = array(
[0] => Array (
['name'] => 'Delta'
['link'] => 'http://www.someotherurl.com'
)
);
$h_l = array();
$m_r = array();
$s_t = array();
$u_z = array(
[0] => Array (
['name'] => 'Zephyr'
['link'] => 'http://www.someurl.com'
)
);
如果一个新的数组值,如[5]=>数组(['name']=>'Kappa'['link']=>'http://www.someurl.com“)
被添加到第一个数组中,它将被添加到$h_l
变量中的数组中
有人知道如何或是否可以做到这一点吗?如果确定哪些值进入哪个数组的标准只是名称,那么有什么原因不能使用foreach()循环主数组并匹配第一个字符?或者,可以使用substr()将第一个字符保存到变量中,然后在switch()测试中与之匹配。如果它纯粹是一对一的排列(即字母表中的每个字母都有不同的数组),那么可以使用一个动态命名的变量来进行关联。好的,我写下我的想法。使用
$$
我将访问一个参数化的变量名。值(例如$a_c、$d_f、ecc…)从我基于实际“name”参数获得的信息开始生成
变量名为:
我得到实际[“name”]值的起始字母(带substr)。使用ord()
我得到ascii格式的对应值
除以/3并乘以3,我得到它所属的“字母组”的第一个字母(例如:如果第一个字母是“B”,我将得到“a_c”的“a”)
该值+2是最后一个字母
我附加这两个信息,返回到带有chr()
的字符串
我根本没有测试,下面是一个示例伪代码:
foreach ($myarray as $value)
{
//finding the name of the variable. the variable name is derived by the letter of the actual value["name"]. the last letter is the first + 2. the name is divided by an underscore.
$first_letter = intval((substr(ord($value["name"], 0, 1)) - ord('A')) / 3)*3 + ord('A');
$last_letter = $first_letter + 2;
$var_name = chr($first_letter)."_".chr($first_letter);
if (!isset($$var_name))
$$var_name = array();
$$var_name[] = $value;
}
这里是一种使用最终输出数组而不是许多不同范围数组的方法 在原始数组中循环,确定第一个字母属于哪个预定义范围,将当前条目添加到最终输出数组的适当范围中
// define ranges
$ranges=array(
'A-C'=>range('A','C'),
'D-G'=>range('D','G'),
'H-K'=>range('H','K'),
'L-O'=>range('L','O'),
'P-S'=>range('P','S'),
'T-W'=>range('T','W'),
'X-Z'=>range('X','Z')
);
// build final array with each entry in its appropriate range
$final=array();
foreach ($data as $item) {
$first_letter=strtoupper(substr($item['name'],0,1));
foreach ($ranges as $label => $range) {
if (in_array($first_letter,$range)) {
$final[$label][]=$item;
break;
}
}
}
// output the final array
echo"<pre>".print_r($final,true)."</pre>";
试试这个功能。此函数由两个参数组成,一个是要搜索的字母,另一个是源数组 //此函数返回名称以字母
m
开头的数组。第一个参数不区分大小写
getNewArray('M',$array)代码>//这里$array是您的源数组。到目前为止您尝试了什么?@almo-do:我没有尝试太多…我真的不知道应该尝试什么,甚至不知道应该寻找什么来帮助我找到它。我见过将数组划分为单独的字母(意思是像‘a’‘B’‘C’而不是‘a-C’这样的导航结构)的情况,但与我需要的不同。关于我可以看什么有什么想法吗?谢谢你的帮助,这很有效!!!
Array
(
[A-C] => Array
(
[0] => Array
(
[name] => Alpha
[link] => http://www.someurl.com
)
[1] => Array
(
[name] => Alpha2
[link] => http://www.someotherurl.com
)
[2] => Array
(
[name] => Beta
[link] => http://www.someurl.com
)
)
[D-G] => Array
(
[0] => Array
(
[name] => Delta
[link] => http://www.someotherurl.com
)
)
[X-Z] => Array
(
[0] => Array
(
[name] => Zephyr
[link] => http://www.someurl.com
)
)
)
function getNewArray($letter='A',$arr){
if(!is_array($arr)) return;
$result=array();
foreach($arr as $a){
if( strtolower(trim($a['name'][0])) === strtolower($letter)){
$result[] = $a;
}
}
return $result;
}