Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从现有多维数组的特定值创建新数组_Php_Arrays_Multidimensional Array - Fatal编程技术网

使用PHP从现有多维数组的特定值创建新数组

使用PHP从现有多维数组的特定值创建新数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,简短的项目描述:我需要从现有数组中输出特定值,用于标签式字母导航。导航将几个字母组合成选项卡(即“A-C”),然后显示以这些字母开头的帖子的所有链接。导航是由插件创建的,所以我需要创建变量来输出组 我拥有的内容:我拥有一个数组,该数组按子数组的名称键按字母顺序排序。它看起来像以下示例: Array ( [0] => Array ( ['name'] => 'Alpha' ['link'] => 'http://www.someurl.com' )

简短的项目描述:我需要从现有数组中输出特定值,用于标签式字母导航。导航将几个字母组合成选项卡(即“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' 
  )

  [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;
}